Index: openacs-4/contrib/packages/vocabulary/vocabulary.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/vocabulary.info,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/vocabulary.info 23 Feb 2004 23:00:05 -0000 1.1
@@ -0,0 +1,24 @@
+
+
+
+
+ Vocabulary
+ Vocabularies
+ f
+ f
+
+
+ Joel Aufrecht
+ A list of vocabulary words.
+ A list of vocubulary words plus tools to edit them; intended as a resource for other packages.
+
+
+
+
+
+
+
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/definition-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/definition-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/definition-list.adp 23 Feb 2004 23:00:05 -0000 1.1
@@ -0,0 +1 @@
+
Index: openacs-4/contrib/packages/vocabulary/lib/definition-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/definition-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/definition-list.tcl 23 Feb 2004 23:00:05 -0000 1.1
@@ -0,0 +1,48 @@
+# expects word_id
+# expect return_url
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set add_url [export_vars -base "definition-edit" {word_id return_url}]
+
+template::list::create \
+ -name definition \
+ -multirow definition \
+ -actions " {Add a Definition} $add_url " \
+ -no_data "No Definitions" \
+ -elements {
+ definition
+ {
+ link_url_col edit_url
+ label "Definition"
+ }
+ locale {label "Locale"}
+ delete {
+ link_url_col delete_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+ }
+
+db_multirow \
+ -extend {
+ edit_url
+ delete_url
+ } definition definition_select {
+ select vd.id,
+ substr(vd.definition,0,20) as definition,
+ al.label as locale
+ from vocab_definition vd,
+ ad_locales al
+ where vd.word_id = :word_id
+ and al.locale = vd.locale
+ order by sort_order
+
+ } {
+ set edit_url [export_vars -base "definition-edit" { id }]
+ set delete_url [export_vars -base "definition-delete" { id return_url}]
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/locale-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/locale-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/locale-count.adp 23 Feb 2004 23:00:05 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/locale-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/locale-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/locale-count.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,75 @@
+ad_page_contract {
+ includelet for grouped locale information
+} {
+ locale_b:optional
+ orderby:optional
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set action [list "Add a word" [export_vars -base word-edit {return_url}] "Add a word"]
+
+template::list::create \
+ -name locale \
+ -multirow locale \
+ -actions $action \
+ -elements {
+ locale {
+ label "Locale"
+ display_template {
+ @locale.locale_label@
+ }
+ orderby {locale_label}
+ }
+ word_count {
+ link_url_col word_locale_url
+ label "Words"
+ orderby {word_count}
+ }
+ sentence_count {
+ link_url_col sentence_locale_url
+ label "Sentences"
+ orderby {sentence_count}
+ }
+ test_count {
+ link_url_col test_locale_url
+ label "Tests"
+ orderby {test_count}
+ }
+ }
+
+# note that the entire query is selected into another query
+# with the meaningless name of superquery in order to
+# create a virtual table to which to apply the where clause
+db_multirow \
+ -extend {
+ word_locale_url
+ sentence_locale_url
+ test_locale_url
+ } locale word_select "
+ select * from (
+ select al.label as locale_label,
+ al.locale,
+ (select count(*)
+ from vocab_word
+ where locale = al.locale
+ and package_id = :package_id) as word_count,
+ (select distinct count(item_id)
+ from vocab_sentencex
+ where locale2 = al.locale) as sentence_count,
+ (select count(id)
+ from vocab_test
+ where locale_a = al.locale
+ and package_id = :package_id) as test_count
+ from ad_locales al
+ group by locale, locale_label) superquery
+ where word_count > 0
+ [template::list::orderby_clause -name locale -orderby]
+
+ " {
+ set word_locale_url [export_vars -base "word-list" {{locale $locale}}]
+ set sentence_locale_url [export_vars -base "sentence-list" {{locale $locale}}]
+ set test_locale_url [export_vars -base "test-list" {{locale $locale}}]
+ }
Index: openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1 @@
+
Index: openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/phonetic-example-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,45 @@
+# expects phonetic_id
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set add_url [export_vars -base "phonetic-example-edit" {phonetic_id return_url}]
+
+template::list::create \
+ -name phonetic_example \
+ -multirow phonetic_example \
+ -actions " {Add an example} $add_url " \
+ -no_data "No examples" \
+ -elements {
+ word {
+ link_url_col edit_url
+ label "Example Word"
+ }
+ comments { label "Comments" }
+ delete {
+ link_url_col delete_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+ }
+
+db_multirow \
+ -extend {
+ edit_url
+ delete_url
+ } phonetic_example phonetic_example_select {
+ select vw.word,
+ vpe.word_id,
+ vpe.comments
+ from vocab_phonetic_example vpe,
+ vocab_word vw
+ where vpe.phonetic_id = :phonetic_id
+ and vw.id = vpe.word_id
+
+ } {
+ set edit_url [export_vars -base "phonetic-example-edit" { {id $word_id} }]
+ set delete_url [export_vars -base "phonetic-example-delete" { {id $word_id} }]
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/phonetic-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/phonetic-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/phonetic-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,3 @@
+@phonetic_name@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/phonetic-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/phonetic-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/phonetic-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,85 @@
+# expects phonetic_locale
+# expects working_locale
+# button_target:optional
+
+set package_id [ad_conn package_id]
+if { [exists_and_not_null button_target ] } {
+ set buttons 1
+} else {
+ set buttons 0
+}
+
+# are we doing IPA or local?
+if { [exists_and_not_null phonetic_locale] } {
+ # we're doing a local phonetic
+ set where_clause "where vp.locale = :phonetic_locale"
+ set field "local_phonetic"
+} else {
+ # we're doing IPA
+ set where_clause "where vp.locale is null"
+ set field "ipa_phonetic"
+}
+
+set add_action [list "Add a Symbol" [export_vars -base phonetic-edit {return_url phonetic_locale} ]]
+
+template::list::create \
+ -name phonetic_list \
+ -multirow phonetic_list \
+ -actions $add_action \
+ -elements {
+ paste {
+ sub_class narrow
+ label "Symbol"
+ display_template "@phonetic_list.paste_html;noquote@"
+ }
+ example {
+ label "as in"
+ }
+ edit {
+ link_url_col edit_url
+ sub_class narrow
+ display_template {
+ @phonetic_list.edit_html;noquote@
+ }
+ }
+ }
+
+db_multirow \
+ -extend {
+ view_url
+ edit_url
+ delete_url
+ onClick
+ paste_html
+ edit_html
+ } phonetic_list phonetic_select "
+ select vp.id,
+ (select word
+ from vocab_word
+ where $field like '%' || vp.phonetic_symbol || '%'
+ and locale = :working_locale
+ and package_id = :package_id
+ limit 1) as example,
+ vp.phonetic_symbol
+ from vocab_phonetic vp
+ $where_clause
+ order by vp.sort_order, vp.phonetic_symbol
+ " {
+ set edit_url [export_vars -base "phonetic-edit" {id}]
+
+ if { $buttons } {
+ set onClick "javascript:$button_target+='$phonetic_symbol'"
+ set paste_html ""
+ set edit_html ""
+ } else {
+ set onClick ""
+ set paste_html "$phonetic_symbol"
+ set edit_html ""
+ }
+ }
+
+set phonetic_name [vocab::phonetic_alphabet_for_locale -locale $phonetic_locale]
+
+if { [exists_and_not_null csv] } {
+ template::list::write_csv -name phonetic_list
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-count.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-count.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,48 @@
+ad_page_contract {
+ includelet for grouped sentence list
+} {
+ locale_b:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+set return_url [export_vars -base $return_url {locale} ]
+set actions [list "Add a Sentence" sentence-edit "Add a Sentence" "Add a Sentence Group" sentence-group-add "Add a Sentence Group"]
+template::list::create \
+ -name sentences \
+ -multirow sentences \
+ -actions $actions \
+ -elements {
+ sentence_count {
+ link_url_col sentence_locale_url
+ label "Sentences"
+ }
+ locale {
+ label "Locale"
+ display_template {
+ @sentences.locale_label@
+ }
+ }
+ }
+
+# TODO: filter by package
+
+db_multirow \
+ -extend {
+ sentence_locale_url
+ } sentences sentence_select "
+ select count(ci.item_id) as sentence_count,
+ al.label as locale_label,
+ al.locale as locale
+ from cr_items ci,
+ vocab_sentence vs,
+ ad_locales al
+ where ci.content_type = 'vocab_sentence'
+ and vs.id = ci.live_revision
+ and al.locale = vs.locale2
+ group by al.label, al.locale
+ " {
+ set sentence_locale_url [export_vars -base "sentence-list" {{locale $locale}}]
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,64 @@
+ad_page_contract {
+ includelet for word list
+} {
+ locale:optional
+ orderby:optional
+ {return_url "."}
+}
+
+set actions [list "Add a Sentence" sentence-edit "Add a Sentence" "Add a Sentence Group" sentence-group-add "Add a Sentence Group"]
+template::list::create \
+ -name sentences \
+ -multirow sentences \
+ -actions $actions \
+ -elements {
+ text {
+ link_url_col edit_url
+ label "Sentence"
+ }
+ locale {
+ label "Language"
+ }
+ delete {
+ link_url_col delete_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+ } \
+ -filters {
+ locale {
+ label "Locale"
+ where_clause {
+ al.locale = :locale
+ }
+ values {
+ [vocab::locale_list]
+ }
+ }
+ }
+
+
+db_multirow \
+ -extend {
+ edit_url
+ delete_url
+ } sentences sentences_select "
+ select ci.item_id as id,
+ al.label as locale,
+ substring(cr.content,0,30) as text
+ from cr_items ci,
+ cr_revisions cr,
+ ad_locales al,
+ vocab_sentence vs
+ where ci.content_type = 'vocab_sentence'
+ and cr.revision_id = ci.live_revision
+ and vs.id = ci.live_revision
+ and al.locale = vs.locale2
+ [template::list::filter_where_clauses -name sentences -and]
+ order by vs.sort_order
+ " {
+ set edit_url [export_vars -base "sentence-edit" {id}]
+ set delete_url [export_vars -base "sentence-delete" {id}]
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/sentence-train-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,99 @@
+ad_page_contract {
+ includelet for sentence list
+} {
+ orderby:optional
+ locale:optional
+ {return_url "."}
+ {group ""}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+set vocab_url [apm_package_url_from_key vocabulary]
+set return_url [export_vars -base [ad_conn url] {locale orderby}]
+#set action [list "Add a new sentence" [export_vars -base sentence-add-wizard] "Add a new sentence"]
+set action [list "Add a group of sentences" [export_vars -base sentence-group-add] "Add a group of sentences"]
+
+template::list::create \
+ -name sentences \
+ -multirow sentences \
+ -actions "$action" \
+ -elements {
+ on_list {
+ label "On your list"
+ display_template {
+ @sentences.on_list_html;noquote@
+ }
+ orderby {on_list}
+ }
+ sentence {
+ label "Sentence"
+ orderby {lower(sentence)}
+ }
+ locale {
+ label "Sentence Locale"
+ orderby {locale}
+ }
+ edit {
+ link_url_col edit_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+ } \
+ -filters {
+ locale {
+ label "Locale"
+ where_clause {
+ al.locale = :locale
+ }
+ values {
+ [vocab::locale_list]
+ }
+ }
+ }
+
+if { [exists_and_not_null group] } {
+ set group_clause " and ci.item_id in (select subject_id from vocab_test_subject where test_id = :group)"
+} else {
+ set group_clause ""
+}
+
+db_multirow \
+ -extend {
+ on_list_html
+ edit_url
+ } sentences sentence_select "
+ select ci.item_id as id,
+ vs.sort_order,
+ cr.content as sentence,
+ al.label as locale,
+ coalesce((select 1
+ from vocab_test
+ where test_type='sentence'
+ and test_subject = ci.item_id),0) as on_list
+ from vocab_sentence vs,
+ cr_items ci,
+ cr_revisions cr,
+ ad_locales al
+ where ci.content_type = 'vocab_sentence'
+ and cr.revision_id = ci.live_revision
+ and vs.id = ci.live_revision
+ and al.locale = vs.locale2
+ $group_clause
+ [template::list::filter_where_clauses -name sentences -and]
+ [template::list::orderby_clause -name sentences -orderby]
+ " {
+ set delete_url [export_vars -base "test-delete" {id return_url}]
+ set edit_url [export_vars -base "${vocab_url}sentence-edit" {id return_url}]
+ set add_url [export_vars -base "sentence-add" {id return_url}]
+ if { $on_list } {
+ set on_list_html ""
+ } else {
+ set on_list_html ""
+ }
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/test-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-count.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-count.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,48 @@
+ad_page_contract {
+ includelet for grouped count of tests
+} {
+ orderby:optional
+ locale:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+set vocab_url [apm_package_url_from_key vocabulary]
+set return_url [ad_conn url]
+set action1 [list "Create a New Test" [export_vars -base test-edit {return_url}] "Create a New Test"]
+
+template::list::create \
+ -name tests \
+ -multirow tests \
+ -actions $action1 \
+ -elements {
+ test_type {
+ link_url_col test_list_url
+ label "Test Type"
+ }
+ label {
+ label "Locale"
+ }
+ count {
+ label "Count"
+ }
+ }
+
+db_multirow -extend { test_list_url } tests test_select "
+ select count(vt.id) as count,
+ vt.test_type,
+ vt.locale_a as locale,
+ al.label
+ from vocab_test vt,
+ ad_locales al
+ where vt.package_id = :package_id
+ and al.locale = vt.locale_a
+ group by vt.test_type, vt.locale_a, al.label
+" {
+ set test_list_url [export_vars -base "test-list" {test_type locale}]
+}
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,3 @@
+(Only 50 items are shown at a time. Real pagination forthcoming ...)
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,108 @@
+ad_page_contract {
+ includelet for word list
+} {
+ orderby:optional
+ locale_filter:optional
+ test_type_filter:optional
+ {result_count_filter ""}
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+
+set return_url [export_vars -base [ad_conn url] {test_type orderby locale return_url}]
+
+template::list::create \
+ -name tests \
+ -multirow tests \
+ -elements {
+ on_list {
+ label "On your list"
+ display_template {
+ @tests.on_list_html;noquote@
+ }
+ orderby {on_list}
+ }
+ question {
+ link_url_col test_url
+ display_template {
+ @tests.question;noquote@
+ }
+ label "Test"
+ orderby {question}
+ }
+ result_count {
+ label "Count"
+ orderby {result_count}
+ }
+ result_sum {
+ label "Sum"
+ orderby {result_sum}
+ }
+ delete {
+ link_url_col test_delete_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+ } \
+ -filters {
+ locale_filter {
+ label "Locale"
+ where_clause {
+ vt.locale_a = :locale_filter
+ }
+ values {
+ [vocab::locale_list]
+ }
+ }
+ test_type {
+ label "Test Type"
+ where_clause {
+ vt.test_type = :test_type_filter
+ }
+ values {
+ [vocab::train::test_type_list]
+ }
+ }
+ }
+
+db_multirow -extend { test_url test_train_add_url test_train_delete_url on_list_html test_delete_url } tests select_tests "
+ select vt.id,
+ vt.test_type,
+ coalesce((select 1
+ from vocab_user_test_map
+ where test_id = vt.id
+ and user_id = :user_id),0) as on_list,
+ question,
+ coalesce((select count(*)
+ from vocab_test_result
+ where test_id = vt.id
+ and user_id = :user_id),0) as result_count,
+ coalesce((select sum(result1)
+ from vocab_test_result
+ where test_id = vt.id
+ and user_id = :user_id),0) as result_sum
+ from vocab_test vt
+ where package_id = :package_id
+ [template::list::filter_where_clauses -name tests -and]
+ [template::list::orderby_clause -name tests -orderby]
+limit 500
+" {
+ set test_train_add_url [export_vars -base "test-train-add" {id return_url}]
+ set test_train_delete_url [export_vars -base "test-train-delete" {id return_url}]
+ set test_url [export_vars -base "test" {{test_id $id} test_type }]
+ set test_delete_url [export_vars -base "test-delete" {id return_url}]
+
+ if { $on_list } {
+ set on_list_html ""
+ } else {
+ set on_list_html ""
+ }
+
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/test-user-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-user-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-user-count.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-user-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-user-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-user-count.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,48 @@
+ad_page_contract {
+ includelet for grouped count of tests
+} {
+ orderby:optional
+ locale:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+set vocab_url [apm_package_url_from_key vocabulary]
+set return_url [ad_conn url]
+set action1 [list "Add test" [export_vars -base test-add {return_url}] "Add test"]
+
+template::list::create \
+ -name tests \
+ -multirow tests \
+ -actions $action1 \
+ -no_data "You don't have any tests." \
+ -elements {
+ test_type {
+ label "Test Type"
+ }
+ label {
+ label "Locale"
+ }
+ count {
+ label "Count"
+ }
+ }
+
+db_multirow tests test_select "
+ select count(vt.id) as count,
+ vt.test_type,
+ al.label
+ from vocab_test vt,
+ vocab_user_test_map vutm,
+ ad_locales al
+ where vutm.user_id = :user_id
+ and vt.id = vutm.test_id
+ and vt.package_id = :package_id
+ and al.locale = vt.locale_a
+ group by vt.test_type, al.label
+"
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-user-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-user-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-user-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/test-user-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/test-user-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/test-user-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,93 @@
+ad_page_contract {
+ includelet for word list
+} {
+ orderby:optional
+ locale:optional
+ test_type:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+
+set return_url [export_vars -base [ad_conn url] {test_type orderby locale return_url}]
+
+template::list::create \
+ -name tests \
+ -multirow tests \
+ -elements {
+ id {
+ link_url_col test_url
+ label "Test"
+ }
+ test_type {
+ label "Type"
+ }
+ result_count {
+ label "Count"
+ }
+ result_sum {
+ label "Sum"
+ }
+ score {
+ label "Average"
+ }
+
+ last_five {
+ label "Last 5"
+ }
+ } \
+ -filters {
+ test_type {
+ label "Test Type"
+ where_clause {
+ vt.test_type = :test_type
+ }
+ values {
+ [vocab::train::test_type_list]
+ }
+ }
+ }
+
+# TODO: this query is not package-away - should join with tests as well
+# get all tests with results or on the test list
+# TODO: this query needs more help
+db_multirow -extend { test_url test_train_add_url test_train_delete_url on_list_html score last_five } tests select_tests "
+ select vt.id,
+ max(vt.test_type) as test_type,
+ coalesce(count(vtr.answer1),0) as result_count,
+ coalesce(sum(vtr.result1),0) as result_sum
+ from vocab_test vt
+ inner join vocab_test_result vtr on vtr.test_id = vt.id and vtr.user_id = :user_id
+ [template::list::filter_where_clauses -name tests -and]
+ group by vt.id
+ UNION
+ select vt.id,
+ max(vt.test_type) as test_type,
+ 0 as result_count,
+ 0 as result_sum
+ from vocab_test vt
+ inner join vocab_user_test_map vutm on vutm.test_id = vt.id and vutm.user_id = :user_id
+ [template::list::filter_where_clauses -name tests -and]
+ group by vt.id
+ [template::list::orderby_clause -name tests -orderby]
+" {
+ set test_train_add_url [export_vars -base "test-train-add" {id return_url}]
+ set test_train_delete_url [export_vars -base "test-train-delete" {id return_url}]
+ set test_url [export_vars -base "test" {{test_id $id} test_type }]
+ if { $result_count > 0} {
+ set score "[expr {$result_sum * 100} / $result_count]%"
+ } else {
+ set score "n/a"
+ }
+
+# if { $result_five_count == 5 } {
+# set last_five [expr ($result_sum * 100) / 5]
+# } else {
+ set last_five ""
+# }
+
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/word-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-count.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/word-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-count.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,49 @@
+ad_page_contract {
+ includelet for grouped word list
+} {
+ locale_b:optional
+ orderby:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+set return_url [export_vars -base "." {locale orderby} ]
+set action [list "Add a word" [export_vars -base word-edit {return_url}]]
+
+template::list::create \
+ -name words \
+ -multirow words \
+ -actions $action \
+ -elements {
+ word_count {
+ link_url_col word_locale_url
+ label "Words"
+ orderby {word_count}
+ }
+ locale {
+ label "Locale"
+ display_template {
+ @words.locale_label@
+ }
+ orderby {locale_label}
+ }
+ }
+
+db_multirow \
+ -extend {
+ word_locale_url
+ } words word_select "
+ select count(vw.id) as word_count,
+ al.label as locale_label,
+ al.locale as locale
+ from vocab_word vw,
+ ad_locales al
+ where vw.package_id = :package_id
+ and al.locale = vw.locale
+ group by al.label, al.locale
+ [template::list::orderby_clause -name words -orderby]
+ " {
+ set word_locale_url [export_vars -base "word-list" {{locale $locale}}]
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/lib/word-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/word-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,121 @@
+ad_page_contract {
+ includelet for word list
+} {
+ locale_b:optional
+ locale:optional
+ orderby:optional
+ {paginate "a"}
+ return_url:optional
+}
+
+# doing this here instead of page_contract because defaults work
+# unexpectedly in page contract in includelet
+if { ![exists_and_not_null return_url] } {
+ set return_url [ad_conn url][ad_conn query]
+}
+
+# do some cheap-ass pagination until somebody explains to me how to
+# use Jon Griffin's paginator from within a template::list
+
+set paginate_like $paginate%
+vocab::conn
+set action [list "Add a word" [export_vars -base word-edit {return_url}] "Add a word"]
+set action [concat $action [list "Import word list" [export_vars -base word-list-add {return_url}] "Import a word list"]]
+set locale_b_label [ad_locale_get_label $locale_b]
+template::list::create \
+ -name words \
+ -multirow words \
+ -actions $action \
+ -elements {
+ word {
+ link_url_col edit_url
+ label "Word"
+ orderby {lower(word)}
+ }
+ phonetic {
+ label ""
+ sub_class narrow
+ }
+ label {
+ label "Locale"
+ orderby {lower(al.locale)}
+ }
+ definition {
+ label "Meaning in [set locale_b_label]"
+ }
+ on_list {
+ label "On your list"
+ display_template {
+ @words.on_list_html;noquote@
+ }
+ orderby {on_list}
+ }
+ delete {
+ link_url_col delete_url
+ display_template {
+
+ }
+ sub_class narrow
+ }
+
+ } \
+ -filters {
+ locale {
+ label "Locale"
+ where_clause {
+ al.locale = :locale
+ }
+ values {
+ [vocab::locale_list]
+ }
+ }
+ paginate {
+ label "Letter"
+ where_clause "
+ (vw.word like :paginate_like or vw.local_phonetic like :paginate_like)
+ "
+ values {
+ [vocab::letter_list]
+ }
+ }
+ }
+
+db_multirow \
+ -extend {
+ edit_url
+ delete_url
+ on_list_html
+ } words word_select "
+ select vw.id,
+ vw.word,
+ al.label as label,
+ coalesce(local_phonetic,ipa_phonetic) as phonetic,
+ (select substring(definition,0,20)
+ from vocab_definition
+ where word_id = vw.id
+ and locale = :locale_b
+ limit 1) as definition,
+ coalesce((select 1
+ from vocab_word_list
+ where word_id = vw.id
+ and user_id = :user_id
+ and package_id = :package_id),0) as on_list
+ from vocab_word vw,
+ ad_locales al
+ where vw.package_id = :package_id
+ and al.locale = vw.locale
+ [template::list::filter_where_clauses -name words -and]
+ [template::list::orderby_clause -name words -orderby]
+ " {
+ set edit_url [export_vars -base "word-edit" {id}]
+ set delete_url [export_vars -base "word-delete" {id return_url}]
+
+ set delete_train_url [export_vars -base "word-train-delete" {id return_url}]
+ set add_train_url [export_vars -base "word-train-add" {id return_url}]
+ if { $on_list } {
+ set on_list_html "[vocab::img::checkedbox]"
+ } else {
+ set on_list_html "[vocab::img::checkbox]"
+ }
+ }
+
Index: openacs-4/contrib/packages/vocabulary/lib/word-train-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-train-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-train-list.adp 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,2 @@
+
+
Index: openacs-4/contrib/packages/vocabulary/lib/word-train-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/lib/word-train-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/lib/word-train-list.tcl 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,85 @@
+ad_page_contract {
+ includelet for word list
+} {
+ orderby:optional
+ locale:optional
+ {return_url "."}
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::get_user_id]
+set vocab_url [apm_package_url_from_key vocabulary]
+set return_url [export_vars -base [ad_conn url] {locale orderby}]
+#set action2 [list "Add a new word" [export_vars -base word-add-wizard] "Add a new word"]
+
+template::list::create \
+ -name words \
+ -multirow words \
+ -elements {
+ on_list {
+ label "On your list"
+ display_template {
+ @words.on_list_html;noquote@
+ }
+ orderby {on_list}
+ }
+ word {
+ label "Word"
+ orderby {lower(word)}
+ }
+ locale {
+ label "Word Locale"
+ orderby {locale}
+ }
+ ipa_phonetic {
+ label "IPA Phonetic"
+ orderby {ipa_phonetic}
+ }
+ local_phonetic {
+ label "Local Phonetic"
+ orderby {local_phonetic}
+ }
+ } \
+ -filters {
+ locale {
+ label "Locale"
+ where_clause {
+ al.locale = :locale
+ }
+ values {
+ [vocab::locale_list]
+ }
+ }
+ }
+
+db_multirow \
+ -extend {
+ on_list_html
+ } words word_select "
+ select vw.id,
+ vw.word,
+ al.label as locale,
+ vw.ipa_phonetic,
+ vw.local_phonetic,
+ coalesce((select 1
+ from vocab_word_list
+ where word_id = vw.id
+ and user_id = :user_id
+ and package_id = :package_id),0) as on_list
+ from vocab_word vw,
+ ad_locales al
+ where al.locale = vw.locale
+ [template::list::filter_where_clauses -name words -and]
+ [template::list::orderby_clause -name words -orderby]
+ " {
+ set delete_url [export_vars -base "word-delete" {id return_url}]
+ set add_url [export_vars -base "word-add" {id return_url}]
+ if { $on_list } {
+ set on_list_html ""
+ } else {
+ set on_list_html ""
+ }
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/ipa.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/ipa.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/ipa.sql 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,55 @@
+--
+-- PostgreSQL database dump
+--
+
+COPY vocab_phonetic (id, locale, sort_order, phonetic_symbol) FROM stdin;
+8 \N \N ʌ
+9 \N \N ɑ
+10 \N \N æ
+11 \N \N e
+12 \N \N ə
+13 \N \N ɪ
+14 \N \N i
+15 \N \N u
+16 \N \N o
+17 \N \N ɔ
+18 \N \N ð
+19 \N \N p
+20 \N \N b
+21 \N \N t
+22 \N \N d
+23 \N \N k
+24 \N \N g
+25 \N \N m
+26 \N \N n
+27 \N \N f
+28 \N \N v
+29 \N \N s
+30 \N \N h
+31 \N \N l
+32 \N \N w
+33 \N \N ʙ
+34 \N \N ɐ
+35 \N \N ɒ
+36 \N \N ɓ
+37 \N \N β
+38 \N \N ɕ
+39 \N \N ç
+40 \N \N ɗ
+41 \N \N ɖ
+42 \N \N ʤ
+43 \N \N ˈ
+44 \N \N ˌ
+45 \N \N ʴ
+46 \N \N ̚
+47 \N \N ɛ
+48 \N \N ŋ
+49 \N \N ʒ
+50 \N \N j
+51 \N \N ʃ
+52 \N \N θ
+\.
+
+SELECT pg_catalog.setval ('vocab_phonetic_id_seq', 52, true);
+
+
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-create.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-create.sql 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,10 @@
+--
+
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-create.sql,v 1.1 2004/02/23 23:00:06 joela Exp $
+--
+
+\i vocabulary-tables-create.sql
+\i vocabulary-train-tables-create.sql
+\i ipa.sql
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-drop.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-drop.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-drop.sql 23 Feb 2004 23:00:06 -0000 1.1
@@ -0,0 +1,8 @@
+--
+
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-drop.sql,v 1.1 2004/02/23 23:00:06 joela Exp $
+--
+\i vocabulary-train-tables-drop.sql
+\i vocabulary-tables-drop.sql
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-create.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-create.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,215 @@
+--
+
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-tables-create.sql,v 1.1 2004/02/23 23:00:07 joela Exp $
+--
+
+select acs_object_type__create_type (
+ 'vocab_word', -- object_type
+ 'word', -- pretty_name
+ 'words', -- pretty_plural
+ 'acs_object', -- supertype
+ 'vocab_word', -- table_name
+ 'id', -- id_column
+ null, -- package_name
+ 'f', -- abstract_p
+ null, -- type_extension_table
+ 'vocab_word__name' -- name_method
+);
+
+create table vocab_word (
+ id integer
+ constraint vocab_word_id_fk
+ references acs_objects(object_id)
+ constraint vocab_word_pk
+ primary key,
+ word varchar(50)
+ not null,
+ locale varchar(30)
+ constraint vocab_word_locale_fk
+ references ad_locales,
+ ipa_phonetic varchar(100),
+ local_phonetic varchar(100),
+ package_id integer
+ not null
+ constraint vocab_word_package_id_fk
+ references apm_packages
+);
+
+comment on table vocab_word is '
+Each record is a single word in a single locale. Homonyms should have their own entries.';
+
+comment on column vocab_word.word is 'The spelling of the word in its native character set. Should be unicode.';
+
+comment on column vocab_word.ipa_phonetic is 'International Phonetic Alphabet spelling.';
+
+comment on column vocab_word.local_phonetic is 'Spelling in appropriate phonetic alphabet.';
+
+create or replace function vocab_word__name (integer)
+returns varchar as '
+declare
+ p_id alias for $1;
+ v_name varchar;
+begin
+ select word into v_name
+ from vocab_word
+ where id = p_id;
+ return v_name;
+end;
+' language 'plpgsql';
+
+create or replace function vocab_word__new (
+ integer, -- package_id
+ varchar, -- word
+ varchar, -- locale
+ varchar, -- ipa_phonetic
+ varchar, -- local_phonetic
+ integer, -- creation_user
+ varchar -- creation_ip
+) returns integer as '
+declare
+ p_package_id alias for $1;
+ p_word alias for $2;
+ p_locale alias for $3;
+ p_ipa_phonetic alias for $4;
+ p_local_phonetic alias for $5;
+ p_creation_user alias for $6;
+ p_creation_ip alias for $7;
+ v_id integer;
+begin
+ v_id := acs_object__new (
+ null,
+ ''vocab_word'',
+ current_timestamp,
+ p_creation_user,
+ p_creation_ip,
+ p_package_id
+ );
+
+ insert into vocab_word (
+ id,
+ package_id,
+ word,
+ locale,
+ ipa_phonetic,
+ local_phonetic
+ ) values (
+ v_id,
+ p_package_id,
+ p_word,
+ p_locale,
+ p_ipa_phonetic,
+ p_local_phonetic
+ );
+
+ PERFORM acs_permission__grant_permission(
+ v_id,
+ p_creation_user,
+ ''admin''
+ );
+
+ return v_id;
+end;
+' language 'plpgsql';
+
+create or replace function vocab_word__delete (integer)
+returns integer as '
+declare
+ p_id alias for $1;
+begin
+ delete from vocab_word
+ where id = p_id;
+ PERFORM acs_object__delete(p_id);
+ return 0;
+
+end;
+' language 'plpgsql';
+
+create table vocab_definition (
+ id serial
+ constraint vocab_def_pk
+ primary key,
+ word_id integer
+ constraint vocab_def_word_fk
+ references vocab_word,
+ sort_order integer,
+ locale varchar(30)
+ constraint vocab_word_locale_fk
+ references ad_locales,
+ definition text,
+ unique (word_id, locale, sort_order)
+);
+
+comment on table vocab_definition is 'Each record is one definition of one word in one locale. This means that definitions are arbitrary text instead of links to other words. TODO: Perhaps we should optionally link to another word here. so that a definition can be more or less structured.';
+
+create table vocab_phonetic (
+ id serial
+ constraint vocab_phonetic_pk
+ primary key,
+ phonetic_symbol varchar(5),
+ locale varchar(30)
+ constraint vocab_word_locale_fk
+ references ad_locales,
+ sort_order integer
+ );
+
+comment on table vocab_phonetic is 'Each record is a letter in a phonetic alphabet. Deliberately package_ignorant.';
+
+comment on column vocab_phonetic.locale is 'Null is assumed to be IPA.';
+
+create table vocab_phonetic_example (
+ id serial
+ constraint vocab_phonetic_example_pk
+ primary key,
+ phonetic_id integer
+ constraint vocab_phonetic_phonetic_fk
+ references vocab_phonetic,
+ word_id integer
+ constraint vocab_phonetic_word_fk
+ references vocab_word,
+ comments varchar(100),
+ unique (phonetic_id, word_id)
+);
+
+comment on table vocab_phonetic_example is 'Each record is a word with contains a sound of an PHONETIC symbol. Each record is indirectly locale-specific and package-specific, via word. Since we can auto-generate some of this via direct lookup of phonetic symbols within word text, this table is semi-superfluous. It might see life again holding additional or special comments.';
+
+select content_type__create_type(
+ 'vocab_sentence', -- content_type
+ 'content_revision', -- supertype
+ 'sentence', -- pretty_name,
+ 'sentences', -- pretty_plural
+ 'vocab_sentence', -- table_name
+ 'id', -- id_column
+ null -- name_method
+);
+
+-- we have to create a custom locale field because locale in cr_items
+-- is varchar(4), even though ad_locales locale is varchar(30)
+-- TODO: make this FK to ad_locales
+select content_type__create_attribute(
+ 'vocab_sentence', -- content_type
+ 'locale2', -- attribute_name
+ 'string', -- datatype
+ 'Locale', -- pretty_name
+ 'Locales', -- pretty_plural
+ 1, -- sort_order
+ null, -- default_value
+ 'varchar(30)' -- column_spec
+);
+
+select content_type__create_attribute(
+ 'vocab_sentence', -- content_type
+ 'sort_order', -- attribute_name
+ 'integer', -- datatype
+ 'Sort Order', -- pretty_name
+ 'Sort Orders', -- pretty_plural
+ 2, -- sort_order
+ null, -- default_value
+ 'integer' -- column_spec
+);
+
+-- necessary to work around limitation of content repository:
+select content_folder__register_content_type(-100,'vocab_sentence','t');
+
+create sequence vocab_sentence_name_seq;
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-drop.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-drop.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-tables-drop.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,34 @@
+--
+
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-tables-drop.sql,v 1.1 2004/02/23 23:00:07 joela Exp $
+--
+
+
+select content_type__drop_type(
+ 'vocab_sentence',
+ 't',
+ 't'
+);
+
+drop table vocab_phonetic_example;
+drop table vocab_phonetic;
+drop table vocab_definition;
+
+drop function vocab_word__name (integer);
+drop function vocab_word__new(
+ integer, -- id
+ integer, -- package_id
+ varchar, -- word
+ varchar, -- locale
+ varchar, -- ipa_phonetic
+ varchar, -- local_phonetic
+ timestamptz, -- entry_date
+ integer, -- creation_user
+ varchar -- creation_ip
+);
+drop function vocab_word__delete (integer);
+
+drop table vocab_word;
+select acs_object_type__drop_type ('vocab_word', true);
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-create.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-create.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,93 @@
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-train-tables-create.sql,v 1.1 2004/02/23 23:00:07 joela Exp $
+--
+
+create table vocab_word_list (
+ id serial
+ primary key,
+ user_id integer
+ not null
+ references users,
+ word_id integer
+ not null
+ references vocab_word,
+ locale varchar(30)
+ references ad_locales,
+ date_added timestamptz,
+ package_id integer
+ not null
+ references apm_packages,
+ unique (user_id, word_id, package_id)
+);
+
+comment on table vocab_word_list is '
+Each record is one word which one user has been assigned.';
+
+create table vocab_test (
+ id serial
+ primary key,
+ test_type varchar(30)
+ not null,
+ test_subject integer,
+ question text,
+ answer text,
+ locale_a varchar(30)
+ references ad_locales,
+ locale_b varchar(30)
+ references ad_locales,
+ package_id integer
+ not null
+ references apm_packages
+);
+
+comment on table vocab_test is '
+Each record is one test. Question and Answer may be null, which implies they are derived; or populated, which could be unique data or caching, depending on the test type.';
+
+comment on column vocab_test.test_subject is '
+Depending on test_type, this is the id of a word, sentence, or other object.';
+
+create table vocab_test_subject (
+ test_id integer
+ not null
+ references vocab_test (id),
+ subject_id integer,
+ unique (test_id, subject_id)
+);
+
+comment on table vocab_test_subject is '
+If a test has multiple subjects, store them here.';
+
+create table vocab_user_test_map (
+ id serial
+ primary key,
+ user_id integer
+ not null
+ references users,
+ test_id integer
+ not null
+ references vocab_test (id),
+ date_added timestamptz,
+ unique (user_id, test_id)
+);
+
+comment on table vocab_user_test_map is '
+Each record is the assignment of one test to one user.';
+
+
+create table vocab_test_result (
+ test_id integer
+ not null
+ references vocab_test (id),
+ user_id integer
+ not null
+ references users,
+ date timestamptz,
+ answer1 varchar(500),
+ result1 integer,
+ answer2 varchar(500),
+ result2 integer,
+ answer3 varchar(500),
+ result3 integer
+);
+
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-drop.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-drop.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/vocabulary-train-tables-drop.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,10 @@
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-01
+-- @cvs-id $Id: vocabulary-train-tables-drop.sql,v 1.1 2004/02/23 23:00:07 joela Exp $
+--
+
+drop table vocab_test_result;
+drop table vocab_test_subject;
+drop table vocab_user_test_map;
+drop table vocab_test;
+drop table vocab_word_list;
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.4-0.5d1.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.4-0.5d1.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.4-0.5d1.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,4 @@
+alter table vocab_phonetic rename column phonetic_symbol to phonetic_symbol_old;
+alter table vocab_phonetic add column phonetic_symbol varchar(5);
+update vocab_phonetic set phonetic_symbol=phonetic_symbol_old;
+alter table vocab_phonetic drop column phonetic_symbol_old;
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.5d1-0.5d2.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.5d1-0.5d2.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.5d1-0.5d2.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,47 @@
+select content_type__create_type(
+ 'vocab_sentence', -- content_type
+ 'content_revision', -- supertype
+ 'sentence', -- pretty_name,
+ 'sentences', -- pretty_plural
+ 'vocab_sentence', -- table_name
+ 'id', -- id_column
+ null -- name_method
+);
+
+select content_type__create_attribute(
+ 'vocab_sentence', -- content_type
+ 'locale2', -- attribute_name
+ 'string', -- datatype
+ 'Locale', -- pretty_name
+ 'Locales', -- pretty_plural
+ 1, -- sort_order
+ null, -- default_value
+ 'varchar(30)' -- column_spec
+);
+
+select content_type__create_attribute(
+ 'vocab_sentence', -- content_type
+ 'sort_order', -- attribute_name
+ 'integer', -- datatype
+ 'Sort Order', -- pretty_name
+ 'Sort Orders', -- pretty_plural
+ 2, -- sort_order
+ null, -- default_value
+ 'integer' -- column_spec
+);
+
+select content_type__create_attribute(
+ 'vocab_sentence', -- content_type
+ 'hint', -- attribute_name
+ 'string', -- datatype
+ 'Hint', -- pretty_name
+ 'Hints', -- pretty_plural
+ 3, -- sort_order
+ null, -- default_value
+ 'varchar(100)' -- column_spec
+);
+
+-- necessary to work around limitation of content repository:
+select content_folder__register_content_type(-100,'vocab_sentence','t');
+
+create sequence vocab_sentence_name_seq;
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.6-0.7.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.6-0.7.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.6-0.7.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,7 @@
+select content_type__drop_attribute(
+ 'vocab_sentence', -- content_type
+ 'hint', -- attribute_name
+ 't' -- drop_column
+);
+
+\i ../vocabulary-train-tables-create.sql
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.7-0.8.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.7-0.8.sql,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/sql/postgresql/upgrade/upgrade-0.7-0.8.sql 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,20 @@
+--
+-- packages/vocabulary/sql/postgresql/upgrade/upgrade-0.7-0.8.sql
+--
+-- @author Joel Aufrecht (joel@aufrecht.org)
+-- @creation-date 2004-02-21
+-- @cvs-id $Id: upgrade-0.7-0.8.sql,v 1.1 2004/02/23 23:00:07 joela Exp $
+--
+
+create or replace function vocab_word__delete (integer)
+returns integer as '
+declare
+ p_id alias for $1;
+begin
+ delete from vocab_word
+ where id = p_id;
+ PERFORM acs_object__delete(p_id);
+ return 0;
+
+end;
+' language 'plpgsql';
Index: openacs-4/contrib/packages/vocabulary/tcl/sentence-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/tcl/sentence-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/tcl/sentence-procs.tcl 23 Feb 2004 23:00:07 -0000 1.1
@@ -0,0 +1,141 @@
+# packages/vocabulary/tcl/vocabulary-sentence.tcl
+
+ad_library {
+
+ Procs for sentences.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-22
+ @cvs-id $Id: sentence-procs.tcl,v 1.1 2004/02/23 23:00:07 joela Exp $
+
+}
+
+
+#####################################################################
+# vocab::sentence
+######################################################################
+
+namespace eval vocab::sentence {}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::sentence::get {
+ -id:required
+ -array:required
+} {
+ Retrieve a sentence
+ @param id The id of the sentence
+ @array The name of an array to populate with sentence data
+
+ @return 0 for success, -1 if no row
+} {
+ upvar 1 $array row
+ set got_sentence [db_0or1row sentence_select {
+ select vs.locale2 as locale,
+ cr.content as text
+ from cr_items ci,
+ cr_revisions cr,
+ vocab_sentence vs
+ where ci.item_id = :id
+ and cr.revision_id = ci.live_revision
+ and vs.id = ci.live_revision
+ } -column_array row]
+ if { $got_sentence } {
+ return 0
+ } else {
+ return -1
+ }
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::sentence::new {
+ -user_id:required
+ -package_id:required
+ -text:required
+ -locale:required
+ -word_list
+ -group
+ {-sort_order 0}
+} {
+ This proc adds a sentence.
+
+ @param word_list The name of a list to populate with the sentence's words.
+ @param group The id of a test of type 'sentence_group' to associate this sentence with.
+ @return new sentence object id.
+} {
+
+ set name vocab_sentence[db_nextval vocab_sentence_name_seq]
+ db_transaction {
+ set id [db_string sentence_insert {
+ select content_item__new(:name,-100,null,null,null,:user_id,:package_id,null,'content_item','vocab_sentence',null,null,null,null,null)
+ }]
+
+ set revision_id [db_nextval acs_object_id_seq]
+ if { $sort_order == 0} {
+ set sort_order [db_string get_next_sort "
+ select max(sort_order) + 1
+ from vocab_sentence"]
+ }
+ db_dml revision_add {
+ insert into vocab_sentencei (item_id, revision_id, text, locale2, sort_order)
+ values (:id, :revision_id, :text, :locale, :sort_order)
+ }
+
+ db_exec_plsql make_live {
+ select content_item__set_live_revision(:revision_id)
+ }
+
+ # should probably regexp for all non-alpha
+ if { [exists_and_not_null word_list] } {
+ upvar 1 $word_list extracted_words
+ foreach word [split $text {.;,! ?}] {
+ if {[exists_and_not_null word] } {
+ lappend extracted_words [string tolower $word]
+ }
+ }
+ } else {
+ set extracted_words [list]
+ }
+
+ }
+ return $id
+}
+
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::sentence::edit {
+ -id:required
+ -text:required
+ -locale:required
+ {-sort_order 0}
+} {
+ This proc edits a sentence.
+ @return the id of the sentence.
+} {
+ db_transaction {
+ set revision_id [db_nextval acs_object_id_seq]
+
+ db_dml revision_add {
+ insert into vocab_sentencei (item_id, revision_id, text, locale2, sort_order)
+ values (:id, :revision_id, :text, :locale, :sort_order)
+ }
+
+ db_exec_plsql make_live {
+ select content_item__set_live_revision(:revision_id)
+ }
+ }
+ return $id
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::sentence::delete {
+ -id:required
+} {
+ This proc deletes a sentence.
+ @return 0 for success
+} {
+ auth::require_login
+ db_exec_plsql note_delete {
+ select content_item__delete(:id)
+ }
+ return 0
+}
Index: openacs-4/contrib/packages/vocabulary/tcl/util-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/tcl/util-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/tcl/util-procs.tcl 23 Feb 2004 23:00:08 -0000 1.1
@@ -0,0 +1,373 @@
+ad_library {
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-20
+ @cvs-id $Id: util-procs.tcl,v 1.1 2004/02/23 23:00:08 joela Exp $
+
+}
+
+######################################################################
+# vocab
+######################################################################
+
+namespace eval vocab {}
+
+######################################################################
+ad_proc -public vocab::subnav_prep {
+ -package_id
+} {
+ Build html for package-specific navigation. This is architecturally dirty,
+ because we should use an adp includelet instead, but this will do for now.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-09
+ @return html
+
+} {
+ # for now, cheat and grab these variables from the ether. This is bad
+ # because it assumes vocab::conn is always called before this proc
+ # hmm, maybe it's better to call vocab::conn from here? naw, that
+ # would make all the upvaring confusing
+ upvar label_a label_a
+ upvar label_b label_b
+
+ set base_url [apm_package_url_from_key vocabulary]
+ set locale_url [export_vars -base "locale"]
+
+ lappend linklist [list [export_vars -base ${base_url}word-list] "Words"]
+ lappend linklist [list [export_vars -base ${base_url}sentence-list] "Sentences"]
+ lappend linklist [list [export_vars -base ${base_url}test-list] "Tests"]
+ lappend linklist [list [export_vars -base ${base_url}test] "Random Test"]
+ lappend linklist [list [export_vars -base ${base_url}$locale_url] "($label_a"]
+ lappend linklist [list [export_vars -base ${base_url}$locale_url] "--> $label_b)"]
+ if { [permission::permission_p -object_id $package_id -privilege admin]} {
+ lappend linklist { admin/ "Admin"}
+ }
+ lappend linklist [list [export_vars -base ${base_url}doc] "Help"]
+
+ foreach link $linklist {
+ lappend subnav "[lindex $link 1]"
+ }
+
+ set subnav [join $subnav " "]
+
+ return $subnav
+}
+
+######################################################################
+ad_proc -public vocab::conn {
+} {
+ Set some variables that might be in cookies or might be passed in.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-09
+ @return 0 for success, and upvar some variables.
+} {
+ upvar package_id package_id
+ upvar user_id user_id
+ set user_id [auth::get_user_id]
+ if { ![exists_and_not_null package_id]} {
+ set package_id [ad_conn package_id]
+ }
+
+ upvar locale_a locale_a
+ upvar locale_b locale_b
+ upvar label_a label_a
+ upvar label_b label_b
+
+ set locale [lang::user::locale -package_id $package_id ]
+ if { ![exists_and_not_null locale_a] } {
+ set locale_a [ad_get_cookie locale_a $locale]
+ }
+
+ if { ![exists_and_not_null locale_b] } {
+ set locale_b [ad_get_cookie locale_b $locale]
+ }
+
+ # since these are tamper_susceptible cookies, check them for bad data
+ if { [catch {set label_a [ad_locale_get_label $locale_a] } ] } {
+ set locale_a [lang::user::locale]
+ set label_a [ad_locale_get_label $locale_a ]
+ }
+
+ if { [catch {set label_b [ad_locale_get_label $locale_b] } ] } {
+ set locale_b [lang::user::locale]
+ set label_b [ad_locale_get_label $locale_b ]
+ }
+
+ return 0
+}
+
+######################################################################
+ad_proc -public vocab::locale_list {
+ {-all}
+} {
+ Get a list of all locales in use
+ TODO: not package_aware
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-02
+ @return list of pairs of label and locale
+} {
+
+ if {[exists_and_not_null all] } {
+ set where_clause ""
+ } else {
+ set where_clause "where al.locale in (select distinct locale
+ from vocab_word
+ UNION
+ select distinct locale2
+ from vocab_sentence) "
+ }
+ return [db_list_of_lists locales "
+ select al.label,
+ al.locale
+ from ad_locales al
+ $where_clause
+ order by label"]
+}
+
+
+######################################################################
+ad_proc -public vocab::letter_list {
+} {
+ Cheesy proc used for half-assed pagination
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-22
+ @return list of pairs of letters and labels
+} {
+ set result [list]
+ foreach letter {a b c d e f g h i j k l m n o p q r s t u v w x y z} {
+ lappend result [list $letter $letter]
+ }
+ return $result
+}
+
+######################################################################
+ad_proc -public vocab::phonetic_alphabet_for_locale {
+ {-locale ""}
+} {
+ This could theoretically be an extra attribute in locales, or even a new table to allow multiple phonetic alphabets per locale, but this is simpler:
+
+ @return name of phonetic alphabet for locale
+} {
+ return [switch $locale {
+ "" {format "International Phonetic Alphabet"}
+ da_DK {format "Dania"}
+ en_US {format "none"}
+ ch_ZH {format "Pinyin"}
+ ch_zh {format "Pinyin"}
+ default {format "Phonetic Alphabet for $locale"}
+ }]
+}
+
+
+
+ad_proc -public vocab::csv2list {
+ -str
+ {-sepChar ,}
+} {
+ Split a CSV into a list.
+ http://mini.net/tcl/721.html
+
+ @return A list.
+} {
+ regsub -all {(\A\"|\"\Z)} $str \0 str
+ set str [string map [list $sepChar\"\"\" $sepChar\0\" \
+ \"\"\"$sepChar \"\0$sepChar \
+ $sepChar\"\"$sepChar $sepChar$sepChar \
+ \"\" \" \" \0 ] $str]
+ set end 0
+ while {[regexp -indices -start $end {(\0)[^\0]*(\0)} $str \
+ -> start end]} {
+ set start [lindex $start 0]
+ set end [lindex $end 0]
+ set range [string range $str $start $end]
+ set first [string first $sepChar $range]
+ if {$first >= 0} {
+ set str [string replace $str $start $end \
+ [string map [list $sepChar \1] $range]]
+ }
+ incr end
+ }
+ set str [string map [list $sepChar \0 \1 $sepChar \0 {} ] $str]
+ return [split $str \0]
+}
+
+######################################################################
+# vocab::locale
+######################################################################
+
+namespace eval vocab::locale {}
+
+ad_proc -public vocab::locale::pinyin_num_to_unicode {
+ -string:required
+} {
+ Replaces pinyin in plain ascii and numbers for tone markers with Unicode. Inspired by:
+
+ Pinyin to Unicode Converter
+ Copyright (C) 2002 Konrad Mitchell Lawson
+ http://www.foolsworkshop.com/
+ http://konrad.lawson.net/
+
+ @return A unicode string.
+} {
+ ####################################
+ # step 1:
+ # deal with any ending consonants before the tone number
+ # ie, turn cian1 into cia1n
+ # 1 is a preceeding vowel, if any, in a multi-vowel set
+ # 2 should be exactly one vowel (assume the last vowel is always the
+ # one to get the tone)
+ # 3 is anything after the last vowel and before the first number
+ # 4 is exactly 1 number between 1 and 4
+
+ regsub -all {([aeiou]*)([aeiou]{1}?)(.*)([1-4]{1}?)} $string {\1\2\4\3} newstring
+ # (1 )(2 )(3 )(4 )
+
+ ####################################
+ # step 2:
+ # convert numeric pinyin to Unicode
+
+ array set charMap {
+ a1 ā
+ a2 á
+ a3 ǎ
+ a4 à
+ e1 ē
+ e2 é
+ e3 ě
+ e4 è
+ i1 ī
+ i2 í
+ i3 ǐ
+ i4 ì
+ o1 ō
+ o2 ó
+ o3 ǒ
+ o4 ò
+ u1 ū
+ u2 ú
+ u3 ǔ
+ u4 ù
+ ü1 ǖ
+ ü2 ǘ
+ ü3 ǚ
+ ü4 ǜ
+ }
+
+ set string_unicode [string map -nocase [array get charMap] $newstring]
+ return $string_unicode
+}
+
+ad_proc -public vocab::locale::moby_ascii_to_ipa {
+ -string:required
+} {
+
+ Replaces moby's ascii representation of IPA with unicode. Depending on how standard moby's ascii ipa is, this could be pretty general. This is the second one of these; maybe I should build a general framework proc. Oh head, and this is INCOMPLETEly implemented at the moment. (Thanks emacs for making it nearly impossible to open, edit, and save a simple utf-8 file!)
+ http://www.dcs.shef.ac.uk/research/ilash/Moby/mpron.html
+
+} {
+
+ # should stress markers go before or after the modified letter?
+ # leave it alone for now, but maybe fix it later
+ # there's a good chance that this regsub will fix it:
+ # regsub -all {.*{1}?)([12]{1}?)} $string {\2\1} newstring
+
+ array set charMap {
+ 0 {}
+ 1
+ 2
+ & æ
+ }
+# (@) "a" in "air"
+# A "a" in "far"
+# eI "a" in "day"
+# @ "a" in "ado"
+# or the glide "e" in "system" (dipthong schwa)
+# - "ir" glide in "tire"
+# or the "dl" glide in "handle"
+# or the "den" glide in "sodden" (dipthong little schwa)
+# b "b" in "nab"
+# tS "ch" in "ouch"
+# d "d" in "pod"
+# E "e" in "red"
+# i "e" in "see"
+# f "f" in "elf"
+# g "g" in "fig"
+# h "h" in "had"
+# hw "w" in "white"
+# I "i" in "hid"
+# aI "i" in "ice"
+# dZ "g" in "vegetably"
+# k "c" in "act"
+# l "l" in "ail"
+# m "m" in "aim"
+# N "ng" in "bang"
+# n "n" in "and"
+# Oi "oi" in "oil"
+# A "o" in "bob"
+# AU "ow" in "how"
+# O "o" in "dog"
+# oU "o" in "boat"
+# u "oo" in "too"
+# U "oo" in "book"
+# p "p" in "imp"
+# r "r" in "ire"
+# S "sh" in "she"
+# s "s" in "sip"
+# T "th" in "bath"
+# D "th" in "the"
+# t "t" in "tap"
+# @ "u" in "cup"
+# @r "u" in "burn"
+# v "v" in "average"
+# w "w" in "win"
+# j "y" in "you"
+
+# Z "s" in "vision"
+# z "z" in "zoo"
+
+# Stress or emphasis is marked in the data with the primary "'" or secondary "," marks: "'" (uncurled apostrophe) marks primary stress "," (comma) marks secondary stress. Moby Pronunciator contains many common names and phrases borrowed from other languages; special sounds include (case is significant):
+
+# "A" "a" in "ami"
+# "N" "n" in "Francoise"
+# "R" "r" in "Der"
+# x "ch" in "Bach"
+# y "eu" in "cordon bleu"
+# "Y" "u" in "Dubois"
+
+ set string_unicode [string map -nocase [array get charMap] $newstring]
+ return $string_unicode
+}
+
+
+######################################################################
+# vocab::img
+######################################################################
+
+namespace eval vocab::img {}
+
+
+ad_proc -public vocab::img::checkedbox {
+} {
+ @return HTML for a checked checkbox image
+} {
+ return {}
+}
+
+ad_proc -public vocab::img::checkbox {
+} {
+ @return HTML for a checkbox image
+} {
+ return {}
+}
+
+ad_proc -public vocab::img::help {
+} {
+ @return HTML for help icon
+} {
+ return {}
+}
+
Index: openacs-4/contrib/packages/vocabulary/tcl/vocabulary-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/tcl/vocabulary-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/tcl/vocabulary-procs.tcl 23 Feb 2004 23:00:08 -0000 1.1
@@ -0,0 +1,272 @@
+# packages/vocabulary/tcl/vocabulary-procs.tcl
+
+ad_library {
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-02
+ @cvs-id $Id: vocabulary-procs.tcl,v 1.1 2004/02/23 23:00:08 joela Exp $
+
+}
+
+#####################################################################
+# vocab
+######################################################################
+
+namespace eval vocab {}
+
+#####################################################################
+# vocab::word
+######################################################################
+
+namespace eval vocab::word {}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::new {
+ -package_id:required
+ -word:required
+ -locale:required
+ -user_id:required
+ {-ipa_phonetic ""}
+ {-local_phonetic ""}
+ {-def_locale ""}
+ {-def_list ""}
+} {
+ Insert a word into the system. Insert definitions if provided. Create tests. If locale is Chinese, pinyin with numbers is changed to unicode.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return The object id of the new word.
+
+ @param def_list A comma-separated list of definitions that apply to the word.
+ @param def_locale The locale of all of the definitions in def_list. If def_locale is null, def_list is ignored.
+} {
+
+ if { [string equal [string tolower $locale] "ch_zh"] && [exists_and_not_null local_phonetic] } {
+ set local_phonetic [vocab::locale::pinyin_num_to_unicode -string $local_phonetic]
+ }
+ set id [db_string word_insert "
+ select vocab_word__new(:package_id, :word, :locale, :ipa_phonetic, :local_phonetic, :user_id,null)
+ "]
+
+ if { [exists_and_not_null def_list] } {
+ if { ![exists_and_not_null def_locale]} {
+ # defs but no def_locale? Give up.
+ return $id
+ }
+
+ # TODO: either here or in def::new, should check for
+ # existing words and try to match
+ # and try to link to existing words instead of creating def text
+
+ foreach def [split $def_list ,] {
+ vocab::word::def::new \
+ -word_id $id \
+ -locale $def_locale \
+ -definition [string trim $def]
+ }
+
+ vocab::train::test::new \
+ -package_id $package_id \
+ -test_type "ortho_from_ortho" \
+ -test_subject $id \
+ -locale_a $locale \
+ -locale_b $def_locale
+ }
+ return $id
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::edit {
+ -id:required
+ -word:required
+ -locale:required
+ -ipa_phonetic
+ -local_phonetic
+} {
+ Edit a word into the system.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return The object id of the new word.
+
+} {
+ db_dml word_edit {
+ update vocab_word
+ set word = :word,
+ locale = :locale,
+ ipa_phonetic = :ipa_phonetic,
+ local_phonetic = :local_phonetic
+ where id = :id
+ }
+ return $id
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::get {
+ -id:required
+ -array:required
+ {-locale_b ""}
+} {
+ Return word, ipa_phonetic, local_phonetic, and a list of definitions in the specified locale.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return id for success, -1 for failure.
+
+ @param array The name of an array to return
+} {
+ upvar 1 $array row
+ set got_word [db_0or1row question_select "
+ select vw.word,
+ vw.locale,
+ vw.ipa_phonetic,
+ vw.local_phonetic
+ from vocab_word vw
+ where vw.id = :id
+ " -column_array row]
+
+ if { !$got_word} {
+ return -1
+ }
+
+ if { [exists_and_not_null locale_b] } {
+ set def_list [db_list select_def_list "
+ select definition
+ from vocab_definition
+ where word_id = :id
+ and locale = :locale_b
+ "]
+ }
+
+ if { [exists_and_not_null def_list] } {
+ array set row [list definitions $def_list]
+ } else {
+ array set row [list definitions ""]
+ }
+ return $id
+}
+
+ad_proc -public vocab::word::delete {
+ -id:required
+} {
+ This proc deletes a word.
+ @return 0 for success
+} {
+ # TODO: improve security
+ auth::require_login
+ db_transaction {
+ db_dml word_defs_delete "
+ delete
+ from vocab_definition
+ where word_id = :id"
+ db_dml word_phonetic_example_delete "
+ delete
+ from vocab_phonetic_example
+ where word_id = :id"
+ db_dml word_word_list_delete "
+ delete
+ from vocab_word_list
+ where word_id = :id"
+
+ db_exec_plsql word_delete "
+ select vocab_word__delete(:id)
+ "
+ }
+ return 0
+}
+
+
+#####################################################################
+# vocab::word::def
+######################################################################
+
+namespace eval vocab::word::def {}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::def::new {
+ -word_id:required
+ -locale:required
+ -definition:required
+} {
+ Add a definition to a word.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-10
+ @return 0 for success
+
+} {
+ db_dml definition_insert {
+ insert into vocab_definition
+ (word_id, locale, definition)
+ values (:word_id, :locale, :definition)
+ }
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::def::get {
+ -id:required
+ -array:required
+} {
+ Get a definition.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-10
+ @return 0 for success
+
+ @param array The name of an array to return
+} {
+ upvar 1 $array row
+ db_1row definition_select {
+ select vw.word,
+ vd.word_id,
+ vd.sort_order,
+ vd.locale,
+ vd.definition
+ from vocab_definition vd,
+ vocab_word vw
+ where vd.id = :id
+ and vw.id = vd.word_id
+ } -column_array row
+
+ return 0
+}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::def::get_by_word {
+ -word:required
+ -locale:required
+} {
+ Get a definition.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-10
+ @return A list of definitions for the given word in the given locale.
+
+} {
+ return [db_list get_defs "
+ select vd.definition
+ from vocab_definition vd,
+ vocab_word vw
+ where vw.word = :word
+ and vw.id = vd.word_id
+ and vd.locale = :locale"]
+}
+
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::word::def::delete {
+ -id:required
+} {
+ This proc deletes a definition.
+ @return 0 for success
+} {
+ auth::require_login
+ db_dml def_delete "
+ delete
+ from vocab_definition
+ where id = :id"
+ }
+ return 0
+}
+
+
Index: openacs-4/contrib/packages/vocabulary/tcl/vocabulary-train-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/tcl/vocabulary-train-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/tcl/vocabulary-train-procs.tcl 23 Feb 2004 23:00:08 -0000 1.1
@@ -0,0 +1,245 @@
+ad_library {
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-08
+ @cvs-id $Id: vocabulary-train-procs.tcl,v 1.1 2004/02/23 23:00:08 joela Exp $
+
+}
+
+#---------------------------------------------------------------------
+# vocab::train
+#---------------------------------------------------------------------
+namespace eval vocab::train {}
+
+#---------------------------------------------------------------------
+ad_proc -public vocab::train::test_type_list {
+} {
+ Get a list of all test types.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-18
+ @return list of pairs of label and test_type
+} {
+ lappend list [list sentence sentence]
+ lappend list [list sentence_group sentence_group]
+ lappend list [list sentence_from_hint sentence_from_hint]
+ lappend list [list ortho_from_ortho ortho_from_ortho]
+ return $list
+}
+
+#---------------------------------------------------------------------
+# vocab::train::test
+#---------------------------------------------------------------------
+namespace eval vocab::train::test {}
+
+ad_proc -public vocab::train::test::new {
+ -package_id:required
+ -test_type:required
+ {-test_subject ""}
+ {-question ""}
+ {-answer ""}
+ {-locale_a ""}
+ {-locale_b ""}
+} {
+ Create a new test. Ste the question and answer values. TODO: if test_subject is a list, create multiple records in vocab_test_subject.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-16
+ @return ID of new test, or 0 if there was a problem.
+
+} {
+ # make sure we have all of the data necessary, and get it if we can
+ switch $test_type {
+ sentence {
+ # this isn't implemented yet
+ return 0
+ vocab::sentence::get -id $test_subject -array sentence_array
+ set row(question) "not implemented yet" ;#TODO: get the locale_b translation of a sentence as question,
+ set row(answer) $sentence_array(text)
+ }
+ sentence_from_hint {
+ if { ![exists_and_not_null question] } {
+ return 0
+ }
+ vocab::sentence::get -id $test_subject -array sentence_array
+ if { ![exists_and_not_null answer] } {
+ set answer $sentence_array(text)
+ }
+ }
+ ortho_from_ortho {
+ if { ![exists_and_not_null answer] || ![exists_and_not_null question] } {
+ vocab::word::get \
+ -id $test_subject \
+ -locale_b $locale_b \
+ -array word
+ if { ![exists_and_not_null question] } {
+ if { [exists_and_not_null word(local_phonetic)] } {
+ set phonetic "/$word(local_phonetic)/"
+ } elseif { [exists_and_not_null word(ipa_phonetic)] } {
+ set phonetic "/$word(ipa_phonetic)/"
+ } else {
+ set phonetic ""
+ }
+ set label [ad_locale_get_label $locale_b]
+ set question "What does $word(word) $phonetic mean in $label?"
+ }
+ if { ![exists_and_not_null answer] } {
+ set answer [list $word(definitions)]
+ }
+ }
+ }
+ default {
+ return 0
+ }
+ }
+ set test_id [db_string get_next_testid "
+ select nextval('vocab_test_id_seq')
+ "]
+
+ db_dml insert_test "insert into vocab_test
+ (id, package_id, test_type, test_subject, question, answer, locale_a, locale_b)
+ values (:test_id, :package_id, :test_type, :test_subject, :question, :answer, :locale_a, :locale_b)"
+ return $test_id
+}
+
+
+ad_proc -public vocab::train::test::get {
+ -test_id:required
+ -array:required
+ -target_locale:required
+} {
+ Return the question and answer for a test, depending on test type.
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return The test id.
+
+ @param test_id The test's unique ID
+ @param array The name of an array to return question, answer.
+ @param target_locale The locale_b of the answer.
+} {
+ upvar 1 $array row
+
+ db_1row get_test_info "
+ select test_type,
+ test_subject,
+ question,
+ answer,
+ locale_a
+ from vocab_test
+ where id = :test_id
+ and locale_b = :target_locale
+ " -column_array row
+ return $test_id
+}
+
+ad_proc -public vocab::train::test::delete {
+ -test_id:required
+} {
+ Return the question and answer for a test, depending on test type.
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return 0 for success; 1 for failure.
+
+ @param test_id The test's unique ID
+} {
+
+ # TODO: not checking permission here yet; instead just assuming that
+ # this can only get called by an admin
+ db_transaction {
+ db_dml delete_test_results "
+ delete
+ from vocab_test_result
+ where test_id = :test_id"
+
+ db_dml delete_test "
+ delete
+ from vocab_test
+ where id = :test_id"
+ }
+}
+
+#---------------------------------------------------------------------
+# vocab::train::result
+#---------------------------------------------------------------------
+namespace eval vocab::train::result {}
+
+ad_proc -public vocab::train::result::submit {
+ -test_id:required
+ -user_id:required
+ {-date ""}
+ -answer1:required
+ -array:required
+ -target_locale
+} {
+ Accept a user's answer to a test question, grade it, store and return the results.
+
+ @author Joel Aufrecht
+ @creation-date 2004-02-07
+ @return id of new test result
+
+ @param test_id The intended test id
+ @param answer1 The user's answer to the question.
+ @param date The date of the answer. Defaults to now.
+ @param array The name of an array to return quesion, user's answer, correct answer, and score.
+} {
+ if {![exists_and_not_null date]} {
+ set date [clock_to_ansi [clock seconds]]
+ }
+ upvar 1 $array row
+
+ vocab::train::test::get \
+ -test_id $test_id \
+ -array answer_key \
+ -target_locale $target_locale
+
+ # make sure we have everything we need
+ if { [exists_and_not_null answer_key(answer)] &&
+ ![string equal $answer_key(answer) ""] &&
+ [exists_and_not_null answer_key(test_type)] } {
+
+ switch $answer_key(test_type) {
+ sentence_from_hint {
+ set correct_answer $answer_key(answer)
+ if { [string equal $correct_answer $answer1] } {
+ set score 1
+ } else {
+ set score 0
+ }
+ }
+ ortho_from_ortho {
+ # see if the answer is in the list
+ set answer [join $answer_key(answer)]
+ # lsearch returns -1 for no match, 0 for match on 1st item
+ if { [lsearch $answer $answer1] > -1 } {
+ set score 1
+ } else {
+ set score 0
+ }
+ if { [llength $answer_key(answer)] > 0 } {
+ set correct_answer "[join $answer ", "]"
+ } else {
+ set correct_answer $answer_key(answer)
+ }
+ }
+ default {
+ format "question missing"
+ }
+ }
+ db_dml set_answer "
+ insert into vocab_test_result
+ (test_id, user_id, date, answer1, result1)
+ values (:test_id, :user_id, :date, :answer1, :score)
+ "
+ array set row [list question $answer_key(question)]
+ array set row [list user_answer $answer1]
+ array set row [list correct_answer $correct_answer]
+ array set row [list score $score]
+ array set row [list date $date]
+ array set row [list test_subject $answer_key(test_subject)]
+ } else {
+ array set row [list question $answer_key(question)]
+ array set row [list user_answer $answer1]
+ array set row [list correct_answer "No correct answer defined."]
+ }
+ return 0
+}
Index: openacs-4/contrib/packages/vocabulary/tcl/test/vocabulary-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/tcl/test/vocabulary-procs.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/tcl/test/vocabulary-procs.tcl 23 Feb 2004 23:00:08 -0000 1.1
@@ -0,0 +1,218 @@
+ad_library {
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: vocabulary-procs.tcl,v 1.1 2004/02/23 23:00:08 joela Exp $
+}
+
+aa_register_case -cats { smoke api } \
+ -procs {
+ vocab::word::new
+ vocab::word::get
+ vocab::word::edit
+ vocab::word::delete
+ } \
+ vocabulary__word_basic_tests {
+ Put some sample data in and then retrieve it.
+ } {
+ aa_run_with_teardown \
+ -rollback \
+ -test_code {
+ # use auto-test package id to avoid polluting any real instances
+ set package_id [ad_conn package_id]
+ aa_log "package_id is $package_id"
+ set user_id [auth::require_login]
+
+ #-----------------------------------------------------------------
+ # Generate test data
+ #-----------------------------------------------------------------
+
+ set word "test-wordæ[ad_generate_random_string]"
+ set locale en_US
+ set ipa_phonetic "test-ipa-phoneticø[ad_generate_random_string]"
+ set local_phonetic "test-local-phoneticæ[ad_generate_random_string]"
+ set def_locale da_DK
+ set def_list [list "test-def1[ad_generate_random_string]" "test-def2[ad_generate_random_string]"]
+
+ #-----------------------------------------------------------------
+ # New Record
+ #-----------------------------------------------------------------
+
+ set new_id [vocab::word::new \
+ -package_id $package_id \
+ -word $word \
+ -locale $locale \
+ -ipa_phonetic $ipa_phonetic \
+ -local_phonetic $local_phonetic \
+ -user_id $user_id \
+ -def_locale $def_locale \
+ -def_list $def_list
+ ]
+ aa_true "Creation succeeds" [exists_and_not_null new_id]
+ aa_log "new_id is $new_id"
+
+ #-----------------------------------------------------------------
+ # Retrieve Record
+ #-----------------------------------------------------------------
+
+ vocab::word::get \
+ -id $new_id \
+ -array test_array -locale_b $def_locale
+
+ aa_equals "Word match is successful" $test_array(word) $word
+ aa_equals "ipa_phonetic match is successful" $test_array(ipa_phonetic) $ipa_phonetic
+ aa_equals "local_phonetic match is successful" $test_array(local_phonetic) $local_phonetic
+ aa_equals "definition is successful" [join $test_array(definitions)] $def_list
+
+ #-----------------------------------------------------------------
+ # Edit Record
+ #-----------------------------------------------------------------
+
+ set word_edit "test-wordæ[ad_generate_random_string]"
+ set locale_edit en_US
+ set ipa_phonetic_edit "test-ipa-phoneticø[ad_generate_random_string]"
+ set local_phonetic_edit "test-local-phoneticæ[ad_generate_random_string]"
+
+ set edit_id [vocab::word::edit \
+ -id $new_id \
+ -word $word_edit \
+ -locale $locale_edit \
+ -ipa_phonetic $ipa_phonetic_edit \
+ -local_phonetic $local_phonetic_edit]
+
+ aa_equals "Edit succeeds" $edit_id $new_id
+ # to be pedantic, should also check that neither is null or 0, within the same test
+
+ #-----------------------------------------------------------------
+ # Retrieve Edited
+ #-----------------------------------------------------------------
+
+ vocab::word::get \
+ -id $new_id \
+ -array test_edit_array
+
+ aa_equals "Word match is successful" $test_edit_array(word) $word_edit
+ aa_equals "ipa_phonetic_edit match is successful" $test_edit_array(ipa_phonetic) $ipa_phonetic_edit
+ aa_equals "local_phonetic_edit match is successful" $test_edit_array(local_phonetic) $local_phonetic_edit
+
+ #-----------------------------------------------------------------
+ # Delete
+ #-----------------------------------------------------------------
+
+ set delete_id [vocab::word::delete \
+ -id $new_id]
+
+ aa_equals "Delete succeeds" $delete_id 0
+
+ set after_delete_id [vocab::word::get \
+ -id $new_id \
+ -array after_delete_array]
+
+ aa_equals "Cannot retrieve deleted row" $after_delete_id -1
+ aa_false "Retrieved array should be empty" [array exists after_delete_array]
+ }
+}
+
+aa_register_case -cats { smoke api } \
+ -procs {
+ vocab::sentence::new
+ vocab::sentence::get
+ vocab::sentence::edit
+ vocab::sentence::delete
+ } \
+ vocabulary__sentence_basic_tests {
+ Put some sample data in and then retrieve it.
+ } {
+ aa_run_with_teardown \
+ -rollback \
+ -test_code {
+ # use auto-test package id to avoid polluting any real instances
+ set package_id [ad_conn package_id]
+ aa_log "package_id is $package_id"
+ set user_id [auth::require_login]
+
+ #-----------------------------------------------------------------
+ # Generate test data
+ #-----------------------------------------------------------------
+
+ set text "test sentence [string tolower [ad_generate_random_string]]"
+ set locale en_US
+ set word_list test_word_list
+
+ #-----------------------------------------------------------------
+ # New Record
+ #-----------------------------------------------------------------
+
+ set new_id [vocab::sentence::new \
+ -package_id $package_id \
+ -user_id $user_id \
+ -text $text \
+ -locale $locale \
+ -word_list $word_list]
+
+ aa_true "Creation succeeds" [exists_and_not_null new_id]
+ aa_log "new_id is $new_id"
+
+ #-----------------------------------------------------------------
+ # Retrieve Record
+ #-----------------------------------------------------------------
+
+ vocab::sentence::get \
+ -id $new_id \
+ -array test_array
+
+ aa_equals "Sentence match is successful" $test_array(text) $text
+ aa_equals "locale match is successful" $test_array(locale) $locale
+ aa_equals "word list is correct" $test_word_list [split $text]
+
+ #-----------------------------------------------------------------
+ # Edit Record
+ #-----------------------------------------------------------------
+
+ set text_edit "test sentenceæ [ad_generate_random_string]"
+ set locale_edit en_US
+
+ set edit_id [vocab::sentence::edit \
+ -id $new_id \
+ -text $text_edit \
+ -locale $locale_edit]
+
+ aa_equals "Edit succeeds" $edit_id $new_id
+
+ #-----------------------------------------------------------------
+ # Retrieve Edited
+ #-----------------------------------------------------------------
+
+ vocab::sentence::get \
+ -id $new_id \
+ -array test_edit_array
+
+ aa_equals "Sentence match is successful" $test_edit_array(text) $text_edit
+ aa_equals "Locale match is successful" $test_edit_array(locale) $locale_edit
+ #-----------------------------------------------------------------
+ # Delete
+ #-----------------------------------------------------------------
+
+ set delete_id [vocab::sentence::delete \
+ -id $new_id]
+
+ aa_equals "Delete succeeds" $delete_id 0
+
+ set after_delete_id [vocab::sentence::get \
+ -id $new_id \
+ -array after_delete_array]
+
+ aa_equals "Cannot retrieve deleted row" $after_delete_id -1
+ aa_false "Retrieved array should be empty" [array exists after_delete_array]
+ }
+}
+
+aa_register_case vocabulary__put_and_get_sentence {
+ Put some sample data in and then retrieve it.
+} {
+ aa_log "If you are only seeing this test case, it's because you don't have acs-automatic-testing 5.1 or greater and so you can't see the other cases."
+}
+
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/definition-delete.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/definition-delete.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/definition-delete.tcl 23 Feb 2004 23:00:08 -0000 1.1
@@ -0,0 +1,19 @@
+ad_page_contract {
+ Delete a definition
+
+ @author Joel Aufrecht
+ @cvs-id $Id: definition-delete.tcl,v 1.1 2004/02/23 23:00:08 joela Exp $
+
+ @param id The id of the word to delete
+} {
+ id:integer
+ {return_url "word-list"}
+}
+
+auth::require_login
+
+vocab::word::def::delete \
+ -id $id
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/definition-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/definition-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/definition-edit.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,8 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/definition-edit.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/definition-edit.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/definition-edit.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,88 @@
+ad_page_contract {
+
+ Form for editing a definition.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: definition-edit.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+ word_id:integer,optional
+ id:integer,optional
+} -validate {
+ some_id_provided {
+ if { ![exists_and_not_null word_id] } {
+ if { [exists_and_not_null id] } {
+ set word_id [db_string get_word_id "select word_id
+ from vocab_definition
+ where id = :id"]
+ } else {
+ ad_complain "Neither id nor word_id provided."
+ }
+ }
+ }
+}
+
+set page_title "Add a Definition"
+set word_title [db_string word_title_select "select word from vocab_word where id=:word_id"]
+set context [list [list [export_vars -base "word-edit" { {id $word_id} }] $word_title]]
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set locale_options [vocab::locale_list -all all]
+
+set form_mode [ad_decode [ad_form_new_p -key id] 1 "edit" "display"]
+ad_form \
+ -name definition \
+ -mode $form_mode \
+ -form {
+ {word:text(inform)}
+ {id:key}
+ {word_id:integer(hidden)}
+ {definition:text}
+ {locale:text(select)
+ {label Locale}
+ {options $locale_options}
+ {value $locale_b}
+ }
+ } -new_request {
+
+ set page_title "Add a definition"
+ lappend context $page_title
+
+ } -edit_request {
+
+ vocab::word::def::get -id $id -array def_array
+ set word $def_array(word)
+ set definition $def_array(definition)
+ set locale $def_array(locale)
+
+ set page_title "Edit Definition"
+ lappend context $page_title
+
+ } -new_data {
+
+ auth::require_login
+ vocab::word::def::new \
+ -word_id $word_id \
+ -locale $locale_b \
+ -definition $definition
+
+ } -edit_data {
+
+ auth::require_login
+ db_dml ipa_edit {
+ update vocab_definition
+ set word_id = :word_id,
+ locale = :locale_b,
+ definition = :definition
+ where id = :id
+ }
+
+ } -after_submit {
+
+ ad_returnredirect [export_vars -base "word-edit" { { id $word_id } }]
+ ad_script_abort
+
+ }
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/index.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/index.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/index.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,32 @@
+
+ @title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
Vocabulary stores words, sentences,
+ and phonetic spellings in any language. Definitions in any language
+ can be added to any word. Add words, sentences, or sentence lists
+ to your personal testing list. Test yourself in flashcard or
+ sentence mode.
+
Planned features include: import and export of word lists (leading
+ to full network syncing between vocabulary sites; audio
+ clips and audio testing; printable tests; a framework for asking
+ other people to score your tests and to do the same in exchange. Full TODO list. My goal is to produce a site that
+ supports an active community of language learners helping each
+ other, and is a public domain vocabulary resource.
+
To use the vocabulary, browse the word list and
+ add words to your personal list. Sentences can be added in groups. You
+ can change the language you are being tested
+ in. Good sources of words can be found in the Resources Section. Currently you must
+ mangle word lists into CSV but a dict import filter is pending.
+
+
+
+
+
+
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/index.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/index.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/index.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,15 @@
+ad_page_contract {
+
+ Front page for vocabulary package.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: index.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+}
+
+set title "Vocabulary"
+set context [list]
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
Index: openacs-4/contrib/packages/vocabulary/www/locale.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/locale.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/locale.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
Index: openacs-4/contrib/packages/vocabulary/www/locale.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/locale.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/locale.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,58 @@
+ad_page_contract {
+
+ Front page for vocabulary admin
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: locale.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+ {return_url "."}
+}
+
+set page_title "Language Defaults"
+set context [list $page_title]
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set locale_options [vocab::locale_list -all all]
+
+ad_form \
+ -name locale \
+ -on_request {
+ set package_locale [lang::user::locale -package_id $package_id]
+ } -form {
+ {locale_a:text(select)
+ {label "Foreign Language"}
+ {options $locale_options}
+ {help_text "Default language for new words and questions."}
+ }
+ {locale_b:text(select)
+ {label "Native Language"}
+ {options $locale_options}
+ {help_text "Default language for new definitions and answers."}
+ }
+ {package_locale:text(select)
+ {label Locale}
+ {options $locale_options}
+ {help_text "Language for program interface."}
+ }
+ } -validate {
+ # just in case
+ { locale_a
+ { [catch ad_locale_get_label $locale_a] }
+ "$locale_a is not a valid locale"
+ }
+ { locale_b
+ { [catch ad_locale_get_label $locale_b] }
+ "$locale_b is not a valid locale"
+ }
+ } -on_submit {
+ # we assume this data has been validated
+ ad_set_cookie locale_a $locale_a
+ ad_set_cookie locale_b $locale_b
+ lang::user::set_locale -package_id $package_id $package_locale
+ } -after_submit {
+ ad_returnredirect $return_url
+ ad_script_abort
+ }
Index: openacs-4/contrib/packages/vocabulary/www/master.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/master.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/master.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,10 @@
+
+ @title;noquote@
+ @context;noquote@
+
@subnavbar_link;noquote@
+
+
+
+
+
+
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/phonetic-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/phonetic-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/phonetic-edit.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,12 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/phonetic-edit.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/phonetic-edit.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/phonetic-edit.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,86 @@
+ad_page_contract {
+
+ Form for editing IPA symbols.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: phonetic-edit.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+ id:integer,optional
+ {return_url ""}
+ {phonetic_locale ""}
+}
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+# decide whether or not to do this when not sleepy:
+#set phonetic_locale $locale_b
+set phonetic_name [vocab::phonetic_alphabet_for_locale -locale $phonetic_locale]
+set page_title "Add a $phonetic_name symbol"
+set context $page_title
+set form_mode [ad_decode [ad_form_new_p -key id] 1 "edit" "display"]
+
+ad_form \
+ -name ipa \
+ -mode $form_mode \
+ -form {
+ {return_url:text(hidden),optional
+ {value $return_url}
+ }
+ {phonetic_locale:text(hidden),optional
+ {value $phonetic_locale}
+ }
+ {id:key}
+ {phonetic_symbol:text
+ {label Symbol}
+ {html {size 1}}
+ }
+} -edit_request {
+
+ db_1row ipa_select {
+ select phonetic_symbol
+ from vocab_phonetic
+ where id = :id
+ }
+ set page_title "$phonetic_symbol"
+ append context $page_title
+
+} -new_data {
+
+ set user_id [auth::require_login]
+ db_dml ipa_insert {
+ insert into vocab_phonetic
+ (phonetic_symbol,locale)
+ values (:phonetic_symbol,:phonetic_locale)
+ }
+
+} -edit_data {
+
+ auth::require_login
+ db_dml ipa_edit {
+ update vocab_phonetic
+ set phonetic_symbol = :phonetic_symbol,
+ where id = :id
+ }
+
+} -after_submit {
+
+ ad_returnredirect $return_url
+ ad_script_abort
+
+} -validate {
+
+ {phonetic_symbol
+ { [expr [string length $phonetic_symbol] == 1] }
+ "Symbol must be one character"
+ }
+
+}
+
+# fix null ids here instead of in page contract because doing it in page contract screws
+# up ad_form's assumptions
+if { ![exists_and_not_null id] } {
+ set id ""
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,8 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/phonetic-example-edit.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,98 @@
+ad_page_contract {
+
+ Form for editing IPA symbol examples.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: phonetic-example-edit.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+ phonetic_id:integer,optional
+ id:integer,optional
+} -validate {
+ some_id_provided {
+ if { ![exists_and_not_null phonetic_id] } {
+ if { [exists_and_not_null id] } {
+ set phonetic_id [db_string get_phonetic_id "select phonetic_id
+ from vocab_phonetic_example
+ where id = :id"]
+ } else {
+ ad_complain "Neither id nor phonetic_id provided."
+ }
+ }
+ }
+}
+
+set page_title ""
+set package_id [ad_conn package_id]
+vocab::subnav_prep -package_id $package_id
+
+set phonetic_title [db_string phonetic_title_select "select phonetic_symbol from vocab_phonetic where id=:phonetic_id"]
+
+set context [list [list [export_vars -base "phonetic-edit" { {id $phonetic_id} }] $phonetic_title]]
+
+set word_options [db_list_of_lists words {
+ select (vw.word || ' (' || (select label
+ from ad_locales
+ where locale = vw.locale) || ')'),
+ vw.id
+ from vocab_word vw
+ where vw.package_id = :package_id
+ order by word
+}]
+
+
+set form_mode [ad_decode [ad_form_new_p -key id] 1 "edit" "display"]
+
+ad_form \
+ -name phonetic_example_edit \
+ -mode $form_mode \
+ -form {
+ {id:key}
+ {phonetic_id:integer(hidden)}
+ {symbol:text(inform) {value $phonetic_title}}
+ {word_id:integer(select)
+ {label Word}
+ {options $word_options}
+ }
+ {comments:text,optional}
+ } -new_request {
+ permission::require_permission -object_id [ad_conn package_id] -privilege create
+ set page_title "Add an example"
+ lappend context $page_title
+ } -edit_request {
+ permission::require_write_permission -object_id $package_id
+ db_1row phonetic_example_select {
+ select word_id,
+ comments
+ from vocab_phonetic_example
+ where id = :id
+ }
+ set page_title "Edit $phonetic_title"
+ lappend context $page_title
+
+} -new_data {
+
+ auth::require_login
+ db_dml phonetic_example_insert {
+ insert into vocab_phonetic_example
+ (phonetic_id, word_id, comments)
+ values (:phonetic_id, :word_id, :comments)
+ }
+
+} -edit_data {
+
+ auth::require_login
+ db_dml phonetic_edit {
+ update vocab_phonetic_example
+ set word_id = :word_id,
+ comments = :comments
+ where id = :id
+ }
+
+} -after_submit {
+
+ ad_returnredirect [export_vars -base "phonetic-example" { {id $phonetic_id} } ]
+ ad_script_abort
+
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/sentence-delete.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-delete.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-delete.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,18 @@
+ad_page_contract {
+ Delete a sentence
+
+ @author Joel Aufrecht
+ @cvs-id $Id: sentence-delete.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+ @param item_id The item_id of the note to delete
+} {
+ id:integer
+ {return_url "sentence-list"}
+}
+
+auth::require_login
+
+vocab::sentence::delete -id $id
+
+ad_returnredirect $return_url
+abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/sentence-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-edit.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-edit.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-edit.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-edit.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,89 @@
+ad_page_contract {
+ This is the view-edit page for sentences.
+
+ @author Your Name (you@example.com)
+ @cvs-id $Id: sentence-edit.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+} {
+ id:integer,optional
+}
+
+set page_title "Edit"
+set context [list [list sentence-list Sentences]]
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set locale_options [vocab::locale_list -all all]
+
+ad_form -name sentence -form {
+ {id:key}
+ {locale:text(select)
+ {label Locale}
+ {options $locale_options}
+ }
+ {text:text(textarea)
+ {label Sentence}
+ {html {cols 50}
+ {rows 4}
+ }
+ }
+
+} -new_request {
+
+ set page_title "Add a Sentence"
+ lappend context $page_title
+ # this pre-sets the form locale
+ set locale $locale_a
+
+} -edit_request {
+
+ vocab::sentence::get \
+ -id $id \
+ -array sentence_array
+
+ set locale $sentence_array(locale)
+ set text $sentence_array(text)
+ set page_title "Edit a Sentence"
+ lappend context $page_title
+
+} -new_data {
+
+ set user_id [auth::require_login]
+ set id [vocab::sentence::new \
+ -locale $locale \
+ -package_id $package_id \
+ -user_id $user_id \
+ -text $text \
+ -word_list new_words]
+ set return_url [export_vars -base sentence-words { locale new_words }]
+
+} -edit_data {
+
+ auth::require_login
+ vocab::sentence::edit \
+ -id $id \
+ -text $text \
+ -locale $locale
+ set return_url [export_vars -base [ad_conn url] {id}]
+
+} -after_submit {
+
+ ad_returnredirect $return_url
+ ad_script_abort
+}
+
+# this code must lie fallow until 5.1
+# category::ad_form::add_widgets \
+# -form_name sentence \
+# -container_object_id [ad_conn package_id] \
+# -categorized_object_id [value_if_exists item_id]
+
+# category::map_object \
+# -remove_old \
+# -object_id $item_id \
+# $category_ids
+
+# category::map_object \
+# -remove_old \
+# -object_id $item_id \
+# $category_ids
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-group-add-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-group-add-2.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-group-add-2.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,67 @@
+ad_page_contract {
+
+ Batch sentence add
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: sentence-group-add-2.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+ locale
+ sentence_group
+}
+
+set page_title "Add a group of Sentences"
+set context $page_title
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+# always create a new test, under the assumption that if sentence_group
+# was null, we wouldn't even be here
+
+set test_id [vocab::train::test::new \
+ -package_id $package_id \
+ -test_type "sentence_group" \
+ -locale_a $locale]
+
+# split up each line
+set total_new_words [list]
+while {[regexp {(.[^\n]+)} $sentence_group match_fodder row] } {
+ # remove each row as it's handled
+ set remove_count [string length $row]
+ set sentence_group [string range $sentence_group [expr $remove_count + 1] end]
+ set row [split $row |]
+ set sentence [string trim [lindex $row 0]]
+ set hint [string trim [lindex $row 1]]
+
+ # make a sentence
+ set sentence_id [vocab::sentence::new \
+ -user_id $user_id \
+ -package_id $package_id \
+ -text $sentence \
+ -locale $locale \
+ -word_list new_words]
+
+ append total_new_words $new_words
+ append total_new_words " "
+ # make a test
+ set sentence_test_id [vocab::train::test::new \
+ -package_id $package_id \
+ -test_type "sentence_from_hint" \
+ -test_subject $sentence_id \
+ -locale_a $locale \
+ -question $hint ]
+
+ # put the test in the group
+ db_dml link_sentence_to_group "
+ insert
+ into vocab_test_subject (test_id, subject_id)
+ values (:test_id, :sentence_test_id)"
+
+}
+
+# now give a chance to add all of these lovely new words
+ad_returnredirect [export_vars -base sentence-words { locale {new_words $total_new_words} }]
+
+#ad_returnredirect [export_vars -base sentence-list {{group $test_id}}]
+abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/sentence-group-add.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-group-add.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-group-add.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-group-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-group-add.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-group-add.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,36 @@
+ad_page_contract {
+
+ Batch sentence add
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: sentence-group-add.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+}
+
+set page_title "Add a group of Sentences"
+set context $page_title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set locale_options [vocab::locale_list -all all]
+
+ad_form -name group_sentence_add \
+ -action "sentence-group-add-2" \
+ -form {
+ {
+ locale:text(select)
+ {label Locale}
+ {options $locale_options}
+ {value $locale_a}
+ {help_text "The locale of the sentences."}
+ }
+ {
+ sentence_group:text(textarea)
+ {label "List of sentences."}
+ {html { rows 15 cols 60}}
+ {help_text "To create sentence tests with hints, put each hint at the end of the sentence, after a |."}
+ }
+ }
Index: openacs-4/contrib/packages/vocabulary/www/sentence-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-list.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @title@
+ @context@
+ @subnavbar_link;noquote@
+
+
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/sentence-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-list.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,18 @@
+ad_page_contract {
+
+ List of sentences.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: sentence-list.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+}
+
+set title "Sentences"
+
+set context [list $title]
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-train-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-train-add.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-train-add.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,22 @@
+ad_page_contract {
+ Add a sentence.
+
+ @author Joel Aufrecht
+ @cvs-id $Id: sentence-train-add.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+ @param id The id of the sentence to add
+} {
+ id:integer
+ return_url
+}
+
+set user_id [auth::require_login]
+# Assign this test
+db_dml add_sentence_to_list "
+ insert
+ into vocab_user_test_map (user_id, test_id, date_added)
+ values (:user_id, :id, current_timestamp)
+"
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/sentence-train-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-train-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-train-list.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,7 @@
+
+ @title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-train-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-train-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-train-list.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,16 @@
+ad_page_contract {
+
+ Sentence list
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: sentence-train-list.tcl,v 1.1 2004/02/23 23:00:09 joela Exp $
+
+} {
+}
+
+set title "Sentence List"
+set context $title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
Index: openacs-4/contrib/packages/vocabulary/www/sentence-words-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-words-2.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-words-2.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,31 @@
+ad_page_contract {
+ Process incoming definitions.
+} {
+ locale_a
+ locale_b
+ word:array
+ def:array
+}
+
+if { ![info exists package_id] } {
+ set package_id [ad_conn package_id]
+}
+
+set user_id [auth::require_login]
+
+for {set i 1} { $i <= [array size word] } {incr i} {
+ if { [exists_and_not_null word($i)] && [exists_and_not_null def($i)] } {
+
+ vocab::word::new \
+ -package_id $package_id \
+ -word $word($i) \
+ -locale $locale_a \
+ -user_id $user_id \
+ -def_locale $locale_b \
+ -def_list [list $def($i)]
+
+ }
+}
+
+ad_returnredirect "sentence-list"
+abort
Index: openacs-4/contrib/packages/vocabulary/www/sentence-words.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-words.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-words.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,12 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/sentence-words.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/sentence-words.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/sentence-words.tcl 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,63 @@
+ad_page_contract {
+ Receive a list of words, and show a form to allow definitions to be added.
+} {
+ {new_words ""}
+ {locale ""}
+}
+
+set page_title "Add words from sentences"
+set context [list $page_title]
+set locale_a $locale
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set def_locale $locale_b
+set locale_options [vocab::locale_list -all all]
+
+set locale_b_html [template::widget::menu locale_b $locale_options $locale_b attribute_reference]
+set action_url "sentence-words-2"
+
+if {![exists_and_not_null new_words]} {
+ ad_returnredirect "sentence-list"
+ abort
+}
+
+template::list::create \
+ -name words \
+ -multirow words \
+ -elements {
+ word {
+ label "Word from sentence"
+ display_template {
+
+ }
+ }
+ definition {
+ label "New Definition"
+ display_template {
+
+ }
+ }
+ old_definition {
+ label "Existing Definitions in [set label_b]"
+ display_template {
+ @words.old_definition@
+ }
+ }
+ }
+
+template::multirow create words word old_definition
+
+# TODO: Instead of lsearching used_words, it would be more elegant
+# to just look in the multirow we're creating but I'm not sure
+# how to do that
+
+set used_words [list]
+foreach word $new_words {
+ if { [lsearch $used_words $word] < 0 } {
+ template::multirow append words $word [join [vocab::word::def::get_by_word -word $word -locale $def_locale] {, }]
+ lappend used_words $word
+ }
+}
+
Index: openacs-4/contrib/packages/vocabulary/www/test-2.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-2.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-2.adp 23 Feb 2004 23:00:09 -0000 1.1
@@ -0,0 +1,20 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
@correct_count@ out of @total_count@
+
+<%=[vocab::img::help] %> If you think your answer is correct but it
+ isn't on the list, select it click for a regrading. Your answer
+ will also be added to the list of acceptable definitions.
+
Index: openacs-4/contrib/packages/vocabulary/www/test-2.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-2.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-2.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,98 @@
+ad_page_contract {
+ Process incoming test and show results.
+} {
+ test_id:integer,array
+ a:array
+ {repeat_url ""}
+}
+
+set page_title "Test"
+set context $page_title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set action_url "test-3"
+# kludge here because I can't understand the list stuff
+if { [exists_and_not_null repeat_url] } {
+ set actions [list "Test more" [export_vars -base test ] "Test More" "Repeat this test" $repeat_url "Repeat this test"]
+} else {
+ set actions [list "Test more" [export_vars -base test ] "Test More"]
+}
+
+template::list::create \
+ -name test \
+ -multirow test \
+ -actions $actions \
+ -elements {
+ question {
+ label "Question"
+ display_template {
+ @test.question;noquote@
+ }
+ }
+ user_answer {
+ label "Your Answer"
+ display_template {
+
+
+ @test.user_answer@
+
+
+
+ @test.user_answer@
+
+
+ @test.user_answer@
+
+ }
+ }
+ answer {
+ link_url_col answer_url
+ label "Acceptable Answers"
+ }
+ score {
+ label "Score"
+ }
+ override {
+ display_template {
+
+
+
+
+
+ }
+ }
+ }
+
+template::multirow create test test_id test_subject question user_answer answer score date answer_url
+
+set correct_count 0
+set total_count 0
+
+# TODO: by getting fancier with the array processing,
+# we lost the array ordering. would be nice to fix that,
+# maybe by finding the highest i, then walking up to it,
+# assuming a sparse array
+set searchId [array startsearch test_id]
+for {set j 1} { $j <= [array size test_id] } {incr j} {
+ set i [array nextelement test_id $searchId]
+ set answer_url [export_vars -base "test-edit" {{id $test_id($i)}}]
+ if { [exists_and_not_null test_id($i)] && [exists_and_not_null a($i)] } {
+ vocab::train::result::submit \
+ -test_id $test_id($i) \
+ -user_id $user_id \
+ -answer1 $a($i) \
+ -target_locale $locale_b \
+ -array result
+ if { $result(score) } {
+ incr correct_count
+ }
+ incr total_count
+ template::multirow append test $test_id($i) $result(test_subject) $result(question) $result(user_answer) $result(correct_answer) $result(score) $result(date) $answer_url
+ } else {
+ vocab::train::test::get -test_id $test_id($i) -array result -target_locale $locale_b
+ template::multirow append test "" "" $result(question) "-" [join $result(answer)] "-" "" $answer_url
+ }
+}
+array donesearch test_id $searchId
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/test-3.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-3.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-3.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,77 @@
+ad_page_contract {
+ Process incoming test and show results.
+} {
+ test_id:integer,array
+ a:array
+ date:array
+}
+
+set page_title "Test"
+set context $page_title
+auth::require_login
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set action_url "test-2"
+
+# this probably won't work because we're counting 1,2,3 but
+# array has values of 2, 7, etc. Either rejigger test-2 to make
+# linear numbers or get smarter here
+# and since test-2 uses checkboxes and thus we don't know what
+# we're getting, better get smarter here
+set correct_count 0
+set total_count 0
+set searchId [array startsearch test_id]
+for {set j 1} { $j <= [array size test_id] } {incr j} {
+ set i [array nextelement test_id $searchId]
+ set working_test_id $test_id($i)
+ set working_date $date($i)
+ set working_answer $a($i)
+# if { $test_id($i) = 0 || [exists_and_not_null a($i)] } {
+# continue
+# }
+ # correct an old answer, which means:
+
+ # step 1: erase the old record
+ db_dml delete_old_test "
+ delete
+ from vocab_test_result
+ where user_id = :user_id
+ and test_id = :working_test_id
+ and date = :working_date
+ and answer1 = :working_answer
+ "
+
+ # here we assume that locale_b is unchanged from before
+ # that's probably not a completely safe assumption and we
+ # should pass it
+ vocab::train::test::get \
+ -test_id $working_test_id \
+ -array test_info \
+ -target_locale $locale_b
+
+ # step 2: add the new definition
+ vocab::word::def::new \
+ -word_id $test_info(test_subject) \
+ -locale $locale_b \
+ -definition $working_answer
+
+ set new_answer [list [join $test_info(answer)] $a($i)]
+
+ # step 3: add the new answer to the answer key
+ db_dml update_test_answer "
+ update vocab_test
+ set answer=:new_answer
+ where id = $working_test_id"
+
+ # step 4: pass everything back to the test grader
+ # (sure hope it works!)
+ rp_form_put test_id($i) $working_test_id
+ rp_form_put a($i) $working_answer
+
+}
+array donesearch test_id $searchId
+set internal_path "/packages/[ad_conn package_key]/www/test-2"
+
+rp_internal_redirect $internal_path
Index: openacs-4/contrib/packages/vocabulary/www/test-add.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-add.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-add.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,20 @@
+
+ @title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
Word tests
+
+
b_ortho_from_a_ortho: Given a written word in one language,
+ write a definition in another language. These tests are generated
+ automatically when words are added to word lists.
+
+
Sentence tests
+
+
sentence
+
sentence_from_hint
+
+
+
+
Index: openacs-4/contrib/packages/vocabulary/www/test-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-add.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-add.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,17 @@
+ad_page_contract {
+
+ Front page for vocabulary training.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: test-add.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+} {
+}
+
+set title "Create a New Test"
+set context $title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
Index: openacs-4/contrib/packages/vocabulary/www/test-count.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-count.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-count.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
Index: openacs-4/contrib/packages/vocabulary/www/test-count.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-count.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-count.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,19 @@
+ad_page_contract {
+
+ Test list
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: test-count.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+} {
+ {test_type ""}
+ {id ""}
+}
+
+set page_title "Test List"
+set context $page_title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
Index: openacs-4/contrib/packages/vocabulary/www/test-delete.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-delete.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-delete.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,19 @@
+ad_page_contract {
+ Delete a test.
+
+ @author Joel Aufrecht
+ @cvs-id $Id: test-delete.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+ @param id The id of the word to delete
+} {
+ id:integer
+ {return_url "test-list"}
+}
+
+auth::require_login
+
+vocab::train::test::delete \
+ -test_id $id
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/test-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-edit.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,25 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+ Direct adding and editing of tests not yet implemented. Currently,
+ tests are created automatically by adding new words with
+ definitions, or by adding sentence groups, and tests can be deleted
+ from the test-list view.
+
+
+
Word tests
+
+
ortho_from_ortho: Given a written word in one language,
+ write a definition in another language. These tests are generated
+ automatically when words are added to word lists.
+
+
Sentence tests
+
+
sentence not implemented yet. Given a sentence in one
+ language, produce the same sentence in another language.
+
sentence_from_hint Given a hint, produce an entire
+ sentence from memory.
+
+
Index: openacs-4/contrib/packages/vocabulary/www/test-edit.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-edit.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-edit.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,138 @@
+ad_page_contract {
+
+ Form for viewing and editing individual words
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: test-edit.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+} {
+ id:integer,optional
+ {return_url ""}
+}
+
+set page_title "Edit a test"
+set context [list [list word-list Words]]
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+ad_return_template
+
+#---------------------------------------------------------------------
+
+# set form_mode [ad_decode [ad_form_new_p -key id] 1 "edit" "display"]
+# set new_test_url [export_vars -base test-edit]
+
+# ad_form \
+# -name test \
+# -mode "display" \
+# -form {
+# {id:key}
+# {test:text
+# {label Test}
+# }
+# {locale:text(select)
+# {label Locale}
+# {options $locale_options}
+# }
+# {ipa_phonetic:text,optional
+# {label "IPA"}
+# }
+# }
+
+# if { ![string equal $phonetic_alphabet none]} {
+# ad_form -extend -name test -form {
+# {local_phonetic:text,optional
+# {label "[set phonetic_alphabet]"}
+# }
+# }
+# }
+
+# if { [string equal $form_mode "edit"]} {
+# ad_form -extend -name test -form {
+# {definition:text,optional
+# {label "Definition in [set label_b]"}
+# }
+# }
+# }
+
+# ad_form -extend -name test \
+# -new_request {
+# set page_title "Add a Test"
+# lappend context $page_title
+# set button_target_ipa test.ipa_phonetic.value
+
+# # this pre-sets the form locale
+# set locale $locale_a
+# if { [exists_and_not_null phonetic_alphabet]} {
+# set button_target_locale test.local_phonetic.value
+# }
+# } -edit_request {
+
+# vocab::test::get -id $id -array test_array -locale_b $locale_b
+# set test $test_array(test)
+# set locale $test_array(locale)
+# set ipa_phonetic $test_array(ipa_phonetic)
+# set local_phonetic $test_array(local_phonetic)
+
+# set page_title $test
+# lappend context $page_title
+
+# # this may be redundant with the prefetch
+# set locale_a $locale
+# set phonetic_alphabet [vocab::phonetic_alphabet_for_locale -locale $locale_a]
+
+# if { [string equal $form_mode edit] } {
+# set button_target_ipa test.ipa_phonetic.value
+# if { [exists_and_not_null phonetic_alphabet]} {
+# set button_target_locale test.local_phonetic.value
+# }
+# }
+
+# if {![exists_and_not_null return_url]} {
+# #TODO: new_id is the wrong thing to redirect to, probably thanks
+# # to cr dumbness, so this breaks
+# set return_url [export_vars -base [ad_conn url] {id}]
+# # set return_url "."
+# }
+
+# } -new_data {
+
+# set user_id [auth::require_login]
+# set new_id [vocab::test::new \
+# -package_id $package_id \
+# -test $test \
+# -locale $locale \
+# -ipa_phonetic $ipa_phonetic \
+# -local_phonetic $local_phonetic \
+# -user_id $user_id \
+# -def_locale $locale_b \
+# -def_list $definition
+# ]
+
+# if {![exists_and_not_null return_url]} {
+# #TODO: new_id is the wrong thing to redirect to, probably thanks
+# # to cr dumbness, so this breaks
+# set return_url [export_vars -base test-edit {{id $new_id}}]
+# # set return_url "."
+# }
+
+# ad_returnredirect $return_url
+# ad_script_abort
+
+# } -edit_data {
+
+# auth::require_login
+# vocab::test::edit \
+# -id $id \
+# -test $test \
+# -locale $locale \
+# -ipa_phonetic $ipa_phonetic \
+# -local_phonetic $local_phonetic
+
+# } -after_submit {
+
+# ad_returnredirect $return_url
+# ad_script_abort
+
+# }
+
Index: openacs-4/contrib/packages/vocabulary/www/test-list.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-list.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-list.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,6 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
Index: openacs-4/contrib/packages/vocabulary/www/test-list.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-list.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-list.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,19 @@
+ad_page_contract {
+
+ Test list
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: test-list.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+} {
+ {test_type ""}
+ {id ""}
+}
+
+set page_title "Test List"
+set context $page_title
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
Index: openacs-4/contrib/packages/vocabulary/www/test-train-add.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-train-add.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-train-add.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,23 @@
+ad_page_contract {
+ Add a word and its tests for a user.
+
+ @author Joel Aufrecht
+ @cvs-id $Id: test-train-add.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+ @param id The id of the word to add.
+} {
+ id:integer
+ return_url
+}
+
+set user_id [auth::require_login]
+vocab::conn
+
+db_dml add_word_tests "
+ insert
+ into vocab_user_test_map (user_id, test_id, date_added)
+ values (:user_id, :id, current_timestamp)
+"
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/test-train-delete.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test-train-delete.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test-train-delete.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,27 @@
+ad_page_contract {
+ Delete a word.
+
+ @author Joel Aufrecht
+ @cvs-id $Id: test-train-delete.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+ @param item_id The item_id of the word to delete
+} {
+ id:integer
+ return_url
+}
+
+set user_id [auth::require_login]
+set package_id [ad_conn package_id]
+
+# TODO: suppress any active tests (but don't delete, or we will
+# have to delete any test results too)
+
+db_dml delete_user_test_mapping "
+ delete
+ from vocab_user_test_map
+ where user_id = :user_id
+ and test_id = :id
+"
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/test.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,11 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/test.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/test.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/test.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,122 @@
+ad_page_contract {
+ Framework page for showing a list of questions and collecting answers. Handles specified tests as well choosing random questions if necessary.
+} {
+ {size:integer 10}
+ {test_type ""}
+ {test_id ""}
+}
+
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
+
+set page_title "Test"
+set action_url "test-2"
+set context $page_title
+set repeat_url [export_vars -base [ad_conn url] {size test_type test_id}]
+template::list::create \
+ -name test \
+ -multirow test \
+ -elements {
+ question {
+ label ""
+ display_template {
+ @test.question;noquote@
+ }
+ }
+ answer {
+ label ""
+ display_template {
+
+
+ }
+ }
+ }
+
+# figure out what tests to do
+# this is pretty ad_hoc
+# probably a better thing is to do the figuring first, and then use a switch
+# to do the appropriate retrieval
+# or hide it all in a proc
+if { [string equal $test_type "sentence_group"] } {
+ # if we are told ahead of time that it's a sentence group, then it has its own list of tests
+ db_multirow -extend {question answer_size} test test_select "
+ select vts.subject_id as test_id
+ from vocab_test_subject vts
+ where vts.test_id = :test_id
+ " {
+ vocab::train::test::get -test_id $test_id -array test_array
+ set question $test_array(question)
+ set answer_size 40
+ }
+
+} elseif { [exists_and_not_null test_id] } {
+ # if a specific id is requested, do it
+ db_multirow -extend {question answer_size} test test_select "
+ select vt.id as test_id
+ from vocab_test vt
+ where vt.id = :test_id
+ and vt.package_id = :package_id
+ and vt.test_type != 'sentence_group'
+ " {
+ vocab::train::test::get -test_id $test_id -array test_array -target_locale $locale_b
+ set question $test_array(question)
+ set answer_size 15
+ }
+
+
+} else {
+ # just get ten random tests
+ # excluding sentence_group is a kludge
+ # if user has no tests, go random.
+
+ set user_has_tests [db_string user_has_tests_select "
+ select count(*)
+ from vocab_user_test_map vutm,
+ vocab_test vt
+ where vutm.user_id = :user_id
+ and vt.id = vutm.test_id
+ and vt.package_id = :package_id"]
+
+ if { $user_has_tests > 0 } {
+ db_multirow -extend {question answer_size} test test_select "
+ select vt.id as test_id,
+ random() as random
+ from vocab_user_test_map vutm,
+ vocab_test vt
+ where vutm.user_id = :user_id
+ and vt.id = vutm.test_id
+ and vt.package_id = :package_id
+ and vt.test_type != 'sentence_group'
+ order by random
+ limit $size
+ " {
+ vocab::train::test::get -test_id $test_id -array test_array -target_locale $locale_b
+ set question $test_array(question)
+ set answer_size 10
+ }
+ } else {
+ db_multirow -extend {question answer_size} test test_select "
+ select vt.id as test_id,
+ vt.question,
+ random() as random
+ from vocab_test vt
+ where vt.package_id = :package_id
+ and vt.test_type != 'sentence_group'
+ and vt.locale_b = :locale_b
+ order by random
+ limit $size
+ " {
+ vocab::train::test::get -test_id $test_id -array test_array -target_locale $locale_b
+ set question $test_array(question)
+ set answer_size 10
+ } if_no_rows {
+ # maybe implement this? Right now we don't check label_a, because the purpose
+ # is to show somebody a test and if we check locale_a and locale_b then, thanks
+ # to default locale values, we will usually be showing this message
+ set message "There are no tests from $label_a to $label_b. Try changing your locale."
+ }
+
+
+ }
+
+}
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/vocab.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/vocab.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/vocab.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,15 @@
+
+ @title@
+ @context@
+ @subnavbar_link;noquote@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/vocab.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/vocab.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/vocab.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,15 @@
+ad_page_contract {
+
+ Front page for vocabulary package.
+
+ @author Joel Aufrecht (joel@aufrecht.org)
+ @creation-date 2004-02-01
+ @cvs-id $Id: vocab.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+} {
+}
+
+set title "Words and Sentences"
+set context $title
+vocab::conn
+set subnavbar_link [vocab::subnav_prep -package_id $package_id]
Index: openacs-4/contrib/packages/vocabulary/www/word-delete.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/word-delete.tcl,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/word-delete.tcl 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,19 @@
+ad_page_contract {
+ Delete a word.
+
+ @author Joel Aufrecht
+ @cvs-id $Id: word-delete.tcl,v 1.1 2004/02/23 23:00:10 joela Exp $
+
+ @param id The id of the word to delete
+} {
+ id:integer
+ {return_url "word-list"}
+}
+
+auth::require_login
+
+vocab::word::delete \
+ -id $id
+
+ad_returnredirect $return_url
+ad_script_abort
\ No newline at end of file
Index: openacs-4/contrib/packages/vocabulary/www/word-edit.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/vocabulary/www/word-edit.adp,v
diff -u
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ openacs-4/contrib/packages/vocabulary/www/word-edit.adp 23 Feb 2004 23:00:10 -0000 1.1
@@ -0,0 +1,40 @@
+
+ @page_title@
+ @context@
+ @subnavbar_link;noquote@
+
+
This is version 0.10. It's a "technology preview" because the
+ package is under active development and not fully tested. The
+ API and data model are reasonably stable but may change.
+
I use a native UNICODE postgresql database. I put the line
+ encoding system utf-8 into
+ serverroot/tcl/zz-postload.tcl but I don't know if
+ it made any difference.
+
+
Feature list
+Implemented features are overstruck. Current priorities are in bold face.
+
+
+
+
when creating a word, make ortho tests in two directions
+
make the list of tests prettier
+
+
+
+
Bugs:
+
+
Can be given word tests for words without definitions; these are
+ impossible to pass
+
Random testing will not test you on sentence groups
+
Ordering of test-2 doesn't match test.
+
word tests don't respect testing locale
+
Lots of imported pinyin still has numbers
+
lots of imported definitions have curly brackets
+
random testing doesn't do anything interesting if you haven't
+ added anything to your lists; instead it should just
+ grab something, anything.
+
your scores should instead be a list of all tests you either have
+ results in or have put on your list; ie, merge tests and
+ your tests.
+
can't delete definitions; get error on edit
+
Deleting words fails if definitions are present - should cascade
+
+
Store words
+
+
store words
+
store definitions - support both links and new
+ text as definitions
+
store phonetic spellings
+
store grammar relationships between words (is the plural of, etc)
+
standard category trees (parts of speech, etc)
+
Store licensing information for all content (public domain, GPL,
+ user-only) - via category?
+
Store information about frequency of appearance of words
+
Some prioritization of words, so that some are shown less
+ frequently when you get them right a lot
+
stroke order (via picture?)
+
+
Store Sentences
+
+
Basic sentence storage
+
categorize sentences
+
store sentences in groups (maybe category is enough?)
+
store information about which words are in the sentences
+
store groups of sentences and put a useful label
+ on the group
+
+
Scoring
+
+
Consistent rules for storing scores - ie, all scores are 0-100, so
+ getting a word right is 100, getting 3 of 5
+ sentences is 60.
+
When highlighting errors, do forwards and backwards string match
+ to isolate the problem area.
+
+
Testing
+
+
handle skipped questions
+
fix detection of empty answer keys in test-2.tcl
+
handle a test with no q's
+
Fix bad answers (my answer is correct, edit anwser) for
+ all for just you
+
Show last 5 results and allow filtering out of such words in test
+
add other types of tests:
+
+
full sentences
+
reverse direction for words (from local def to foreign word)
+
phonetic-based
+
sound-based tests
+
+
Better determination of what to test - frequency ranking of tests,
+ or lesson-based testing (from categories?)
+
"you've gotten this right 5 times in a row; only show it rarely in
+ the future? y/n
+
Use a t/f field in tests so that they can be taken off the list
+without losing test results - mooted
+
+
Data
+
+
input the full IPA and example words in English, other languages
+ (54 IPA characters now included in install)
+
Input Dania to the live data, including example words
+
Input the first Chinese words - first 3000 or 6000
+
input some words and definitions from a non-english
+ language
+
Input some chinese 2-character words
+
Input my Danish lessons (copyright issues - need to restrict access)
+
+
Import/Export capability
+
+
CSV export of words, sentences, phonetic alphabets
+
Import a CSV file
+
CSV import of words, sentences, phonetic
+ alphabets
+
export to file - ie, handle mime type correctly
+
find and implement standards. IMS? XML? Dict! Moby.
+
Import/export of tests? SCORM?
+
automatic lookup of external web services
+
Live outgoing feed, RSS etc
+
Framework for syncronizing new data
+
+
automatic matching on words instead of creating new words
+
confirmation/conflict resolution pages
+
+
+
Auto-generate examples by looking into phonetic
+ spelling okay, now do two examples
+
Store sounds
+
+
pronunciations of words
+
pronunciations of sentences
+
provide simple online editing tools (trim .2 sec from front or
+ back, etc) so that people can improve their own uploaded samples to match the others
+
audio tests: see a word, upload your pronunciation, grading by 1)
+ grading yourself after hearing your upload sandwiched between native speaker examples 2) asking for someone to grade you.
+
round-trip audio test: you are given a text. You record yourself
+ and upload it. Someone else transcribes your recording and you can compare that to the original text.
+
+
Printable test pages (flashcard mode; test mode)
+
Utilities
+
+
Show tooltip/link for every foreign word on the page
+
"another useful thing: a bookmarklet: so that while I'm reading a
+chinese page and I run into an unknown word I select it and hit the
+bookmarklet and I get both the dictionary entry plus the word gets
+added to my list. that way I can be sure that whenever I look up a
+word it will also get added to my list"
+
scan a specified text and determine how many of the words I
+already know
+
+
Store and allow changing current working locale
+
Add a wizard for directly adding word+def to word list
+
Navigation & Interface
+
+
Use subnavbar to show locale settings and subglobal
+ nav
+
write a flow map for the whole thing
+
Do the UI improvements from my paper notes
+
Put "Add another word" link on word-edit
+
Consolidate Words, Sentences, Locales into hierarchy, with Locale
+ list, then per-locale page, then sentences & words
+
+
prettier formatting for the white pseudo-button
+
+
Coding Hygiene & Platform
+
+
set and retain the working locales
+
move everything into procs
+
+
Add UI for controlling sort order
+
write a data dictionary/diagram
+
Merge vocabulary and vocabulary-test
+
redo subnav prep as vocab::conn
+
implement the flow map in the new subnavbar
+
Think hard about data model for tests and sentences: put
+ sentence hint in test, not sentence?
+ YES. should tests have user_ids? NO.
+
Use subnavbar to show locale settings and subglobal
+nav
+
Put docs into Docbook
+
use pretty urls
+
Write test cases for all of API
+
Paginate all the lists
+
Eliminate all of the group count views in favor of paginated lists
+that show group count in filter blocks
+
move all data into content repository
+
Performance Tuning
+
+
cache the phonetic chart
+
+
+
+
Refactoring list
+
+
Make all hyperlinks (export_urls) calculate base url with
+package_awareness
+
Enable sort/filter of multiple includes on the same page
+
Make vocabulary-trainer use the same subnav structure as vocab
+
Move locale information into real table (extension of ad_locales,
+with phonetic alphabet name)
+