From e82df13a2844d73f112d57b707aa38c186a8598e Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 1 Apr 2013 15:55:37 -0400 Subject: [PATCH] wikipedia input field --- build.js | 1 + css/app.css | 24 +++++++ data/data_dev.js | 12 ++-- data/presets/fields.json | 2 +- data/presets/fields/wikipedia.json | 4 +- data/presets/schema/field.json | 3 +- data/wikipedia.json | 1 + index.html | 2 + js/id/services/wikipedia.js | 39 ++++++++++ js/id/ui/preset/wikipedia.js | 110 +++++++++++++++++++++++++++++ js/lib/d3.combobox.js | 2 +- 11 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 data/wikipedia.json create mode 100644 js/id/services/wikipedia.js create mode 100644 js/id/ui/preset/wikipedia.js diff --git a/build.js b/build.js index 629443abe..fefd4bdd9 100644 --- a/build.js +++ b/build.js @@ -94,6 +94,7 @@ fs.writeFileSync('data/data.js', 'iD.data = ' + stringify({ discarded: r('discarded.json'), keys: r('keys.json'), imagery: r('imagery.json'), + wikipedia: r('wikipedia.json'), presets: { presets: rp('presets.json'), defaults: rp('defaults.json'), diff --git a/css/app.css b/css/app.css index 48e698024..32f413390 100644 --- a/css/app.css +++ b/css/app.css @@ -1121,6 +1121,29 @@ input[type=number] { background-color: #E8EBFF !important; } +.form-field .wiki-lang { + width: 30%; + border-right: none; + border-radius: 0 0 0 4px; +} + +.form-field .wiki-title { + width: 60%; + border-right: none; + border-radius: 0; +} + +.form-field .wiki-link { + border-radius: 0 0 4px 0; + border: 1px solid #ccc; + border-top: none; + height: 30px; + width: 10%; + float: right; + padding: 5px; + text-align: center; +} + /* Preset form address */ .form-field .addr-housename { @@ -1184,6 +1207,7 @@ div.combobox { .combobox-carat { margin-left: -20px; + margin-right: 10px; display:inline-block; cursor: url(../img/cursor-pointer.png) 6 1, pointer; border-top: 5px solid #ccc; diff --git a/data/data_dev.js b/data/data_dev.js index c3246d66a..c7f5229db 100644 --- a/data/data_dev.js +++ b/data/data_dev.js @@ -8,6 +8,7 @@ iD.data = { path + 'data/deprecated.json', path + 'data/discarded.json', path + 'data/imagery.json', + path + 'data/wikipedia.json', path + 'data/keys.json', path + 'data/presets/presets.json', path + 'data/presets/defaults.json', @@ -19,12 +20,13 @@ iD.data = { deprecated: data[0], discarded: data[1], imagery: data[2], - keys: data[3], + wikipedia: data[3], + keys: data[4], presets: { - presets: data[4], - defaults: data[5], - categories: data[6], - fields: data[7] + presets: data[5], + defaults: data[6], + categories: data[7], + fields: data[8] } }; diff --git a/data/presets/fields.json b/data/presets/fields.json index 0595524fc..40ff42eeb 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -400,7 +400,7 @@ }, "wikipedia": { "key": "wikipedia", - "type": "text", + "type": "wikipedia", "icon": "wikipedia", "universal": true, "label": "Wikipedia" diff --git a/data/presets/fields/wikipedia.json b/data/presets/fields/wikipedia.json index 034b83928..8f4a67d85 100644 --- a/data/presets/fields/wikipedia.json +++ b/data/presets/fields/wikipedia.json @@ -1,7 +1,7 @@ { "key": "wikipedia", - "type": "text", + "type": "wikipedia", "icon": "wikipedia", "universal": true, "label": "Wikipedia" -} \ No newline at end of file +} diff --git a/data/presets/schema/field.json b/data/presets/schema/field.json index 253ab79ff..61a32f220 100644 --- a/data/presets/schema/field.json +++ b/data/presets/schema/field.json @@ -28,7 +28,8 @@ "email", "url", "radio", - "textarea" + "textarea", + "wikipedia" ], "required": true }, diff --git a/data/wikipedia.json b/data/wikipedia.json new file mode 100644 index 000000000..3b9ab6684 --- /dev/null +++ b/data/wikipedia.json @@ -0,0 +1 @@ +[["English","English","en"],["German","Deutsch","de"],["Dutch","Nederlands","nl"],["French","Français","fr"],["Italian","Italiano","it"],["Russian","Русский","ru"],["Spanish","Español","es"],["Polish","Polski","pl"],["Swedish","Svenska","sv"],["Japanese","日本語","ja"],["Portuguese","Português","pt"],["Chinese","中文","zh"],["Vietnamese","Tiếng Việt","vi"],["Ukrainian","Українська","uk"],["Catalan","Català","ca"],["Norwegian (Bokmål)","Norsk (Bokmål)","no"],["Waray-Waray","Winaray","war"],["Cebuano","Sinugboanong Binisaya","ceb"],["Finnish","Suomi","fi"],["Persian","فارسی","fa"],["Czech","Čeština","cs"],["Hungarian","Magyar","hu"],["Korean","한국어","ko"],["Romanian","Română","ro"],["Arabic","العربية","ar"],["Turkish","Türkçe","tr"],["Indonesian","Bahasa Indonesia","id"],["Kazakh","Қазақша","kk"],["Malay","Bahasa Melayu","ms"],["Serbian","Српски / Srpski","sr"],["Slovak","Slovenčina","sk"],["Esperanto","Esperanto","eo"],["Danish","Dansk","da"],["Lithuanian","Lietuvių","lt"],["Basque","Euskara","eu"],["Bulgarian","Български","bg"],["Hebrew","עברית","he"],["Slovenian","Slovenščina","sl"],["Croatian","Hrvatski","hr"],["Volapük","Volapük","vo"],["Estonian","Eesti","et"],["Hindi","हिन्दी","hi"],["Uzbek","O‘zbek","uz"],["Galician","Galego","gl"],["Norwegian (Nynorsk)","Nynorsk","nn"],["Simple English","Simple English","simple"],["Azerbaijani","Azərbaycanca","az"],["Latin","Latina","la"],["Greek","Ελληνικά","el"],["Thai","ไทย","th"],["Serbo-Croatian","Srpskohrvatski / Српскохрватски","sh"],["Georgian","ქართული","ka"],["Occitan","Occitan","oc"],["Macedonian","Македонски","mk"],["Newar / Nepal Bhasa","नेपाल भाषा","new"],["Tagalog","Tagalog","tl"],["Piedmontese","Piemontèis","pms"],["Belarusian","Беларуская","be"],["Haitian","Krèyol ayisyen","ht"],["Tamil","தமிழ்","ta"],["Telugu","తెలుగు","te"],["Belarusian (Taraškievica)","Беларуская (тарашкевіца)","be-x-old"],["Latvian","Latviešu","lv"],["Breton","Brezhoneg","br"],["Malagasy","Malagasy","mg"],["Albanian","Shqip","sq"],["Armenian","Հայերեն","hy"],["Tatar","Tatarça / Татарча","tt"],["Javanese","Basa Jawa","jv"],["Welsh","Cymraeg","cy"],["Marathi","मराठी","mr"],["Luxembourgish","Lëtzebuergesch","lb"],["Icelandic","Íslenska","is"],["Bosnian","Bosanski","bs"],["Burmese","မြန်မာဘာသာ","my"],["Yoruba","Yorùbá","yo"],["Bashkir","Башҡорт","ba"],["Malayalam","മലയാളം","ml"],["Aragonese","Aragonés","an"],["Lombard","Lumbaart","lmo"],["Afrikaans","Afrikaans","af"],["West Frisian","Frysk","fy"],["Western Panjabi","شاہ مکھی پنجابی (Shāhmukhī Pañjābī)","pnb"],["Bengali","বাংলা","bn"],["Swahili","Kiswahili","sw"],["Bishnupriya Manipuri","ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী","bpy"],["Ido","Ido","io"],["Kirghiz","Кыргызча","ky"],["Urdu","اردو","ur"],["Nepali","नेपाली","ne"],["Sicilian","Sicilianu","scn"],["Gujarati","ગુજરાતી","gu"],["Cantonese","粵語","zh-yue"],["Low Saxon","Plattdüütsch","nds"],["Kurdish","Kurdî / كوردی","ku"],["Irish","Gaeilge","ga"],["Asturian","Asturianu","ast"],["Quechua","Runa Simi","qu"],["Sundanese","Basa Sunda","su"],["Chuvash","Чăваш","cv"],["Scots","Scots","sco"],["Interlingua","Interlingua","ia"],["Alemannic","Alemannisch","als"],["Buginese","Basa Ugi","bug"],["Neapolitan","Nnapulitano","nap"],["Samogitian","Žemaitėška","bat-smg"],["Kannada","ಕನ್ನಡ","kn"],["Banyumasan","Basa Banyumasan","map-bms"],["Walloon","Walon","wa"],["Amharic","አማርኛ","am"],["Sorani","Soranî / کوردی","ckb"],["Scottish Gaelic","Gàidhlig","gd"],["Fiji Hindi","Fiji Hindi","hif"],["Min Nan","Bân-lâm-gú","zh-min-nan"],["Tajik","Тоҷикӣ","tg"],["Mazandarani","مَزِروني","mzn"],["Egyptian Arabic","مصرى (Maṣrī)","arz"],["Yiddish","ייִדיש","yi"],["Venetian","Vèneto","vec"],["Mongolian","Монгол","mn"],["Tarantino","Tarandíne","roa-tara"],["Sanskrit","संस्कृतम्","sa"],["Nahuatl","Nāhuatl","nah"],["Ossetian","Иронау","os"],["Sakha","Саха тыла (Saxa Tyla)","sah"],["Kapampangan","Kapampangan","pam"],["Upper Sorbian","Hornjoserbsce","hsb"],["Sinhalese","සිංහල","si"],["Northern Sami","Sámegiella","se"],["Limburgish","Limburgs","li"],["Maori","Māori","mi"],["Bavarian","Boarisch","bar"],["Corsican","Corsu","co"],["Ilokano","Ilokano","ilo"],["Gan","贛語","gan"],["Tibetan","བོད་སྐད","bo"],["Gilaki","گیلکی","glk"],["Faroese","Føroyskt","fo"],["Rusyn","русиньскый язык","rue"],["Punjabi","ਪੰਜਾਬੀ","pa"],["Central_Bicolano","Bikol","bcl"],["Hill Mari","Кырык Мары (Kyryk Mary) ","mrj"],["Võro","Võro","fiu-vro"],["Dutch Low Saxon","Nedersaksisch","nds-nl"],["Turkmen","تركمن / Туркмен","tk"],["Pashto","پښتو","ps"],["West Flemish","West-Vlams","vls"],["Mingrelian","მარგალური (Margaluri)","xmf"],["Manx","Gaelg","gv"],["Zazaki","Zazaki","diq"],["Pangasinan","Pangasinan","pag"],["Komi","Коми","kv"],["Zeelandic","Zeêuws","zea"],["Divehi","ދިވެހިބަސް","dv"],["Oriya","ଓଡ଼ିଆ","or"],["Khmer","ភាសាខ្មែរ","km"],["Norman","Nouormand/Normaund","nrm"],["Romansh","Rumantsch","rm"],["Komi-Permyak","Перем Коми (Perem Komi)","koi"],["Udmurt","Удмурт кыл","udm"],["Meadow Mari","Олык Марий (Olyk Marij)","mhr"],["Ladino","Dzhudezmo","lad"],["North Frisian","Nordfriisk","frr"],["Kashubian","Kaszëbsczi","csb"],["Ligurian","Líguru","lij"],["Wu","吴语","wuu"],["Friulian","Furlan","fur"],["Vepsian","Vepsän","vep"],["Classical Chinese","古文 / 文言文","zh-classical"],["Uyghur","ئۇيغۇر تىلى","ug"],["Saterland Frisian","Seeltersk","stq"],["Sardinian","Sardu","sc"],["Aromanian","Armãneashce","roa-rup"],["Pali","पाऴि","pi"],["Somali","Soomaaliga","so"],["Bihari","भोजपुरी","bh"],["Maltese","Malti","mt"],["Aymara","Aymar","ay"],["Ripuarian","Ripoarisch","ksh"],["Novial","Novial","nov"],["Anglo-Saxon","Englisc","ang"],["Cornish","Kernewek/Karnuack","kw"],["Navajo","Diné bizaad","nv"],["Picard","Picard","pcd"],["Hakka","Hak-kâ-fa / 客家話","hak"],["Guarani","Avañe'ẽ","gn"],["Extremaduran","Estremeñu","ext"],["Franco-Provençal/Arpitan","Arpitan","frp"],["Assamese","অসমীয়া","as"],["Silesian","Ślůnski","szl"],["Gagauz","Gagauz","gag"],["Interlingue","Interlingue","ie"],["Lingala","Lingala","ln"],["Emilian-Romagnol","Emiliàn e rumagnòl","eml"],["Chechen","Нохчийн","ce"],["Kalmyk","Хальмг","xal"],["Palatinate German","Pfälzisch","pfl"],["Hawaiian","Hawai`i","haw"],["Karachay-Balkar","Къарачай-Малкъар (Qarachay-Malqar)","krc"],["Pennsylvania German","Deitsch","pdc"],["Kinyarwanda","Ikinyarwanda","rw"],["Crimean Tatar","Qırımtatarca","crh"],["Acehnese","Bahsa Acèh","ace"],["Tongan","faka Tonga","to"],["Greenlandic","Kalaallisut","kl"],["Lower Sorbian","Dolnoserbski","dsb"],["Aramaic","ܐܪܡܝܐ","arc"],["Erzya","Эрзянь (Erzjanj Kelj)","myv"],["Lezgian","Лезги чІал (Lezgi č’al)","lez"],["Banjar","Bahasa Banjar","bjn"],["Shona","chiShona","sn"],["Papiamentu","Papiamentu","pap"],["Kabyle","Taqbaylit","kab"],["Tok Pisin","Tok Pisin","tpi"],["Lak","Лакку","lbe"],["Buryat (Russia)","Буряад","bxr"],["Lojban","Lojban","jbo"],["Wolof","Wolof","wo"],["Moksha","Мокшень (Mokshanj Kälj)","mdf"],["Zamboanga Chavacano","Chavacano de Zamboanga","cbk-zam"],["Avar","Авар","av"],["Sranan","Sranantongo","srn"],["Mirandese","Mirandés","mwl"],["Kabardian Circassian","Адыгэбзэ (Adighabze)","kbd"],["Tahitian","Reo Mā`ohi","ty"],["Lao","ລາວ","lo"],["Abkhazian","Аҧсуа","ab"],["Tetum","Tetun","tet"],["Latgalian","Latgaļu","ltg"],["Nauruan","dorerin Naoero","na"],["Kongo","KiKongo","kg"],["Igbo","Igbo","ig"],["Northern Sotho","Sesotho sa Leboa","nso"],["Zhuang","Cuengh","za"],["Karakalpak","Qaraqalpaqsha","kaa"],["Zulu","isiZulu","zu"],["Cheyenne","Tsetsêhestâhese","chy"],["Romani","romani - रोमानी","rmy"],["Old Church Slavonic","Словѣньскъ","cu"],["Tswana","Setswana","tn"],["Cherokee","ᏣᎳᎩ","chr"],["Bislama","Bislama","bi"],["Min Dong","Mìng-dĕ̤ng-ngṳ̄","cdo"],["Gothic","𐌲𐌿𐍄𐌹𐍃𐌺","got"],["Samoan","Gagana Samoa","sm"],["Moldovan","Молдовеняскэ","mo"],["Bambara","Bamanankan","bm"],["Inuktitut","ᐃᓄᒃᑎᑐᑦ","iu"],["Norfolk","Norfuk","pih"],["Pontic","Ποντιακά","pnt"],["Sindhi","سنڌي، سندھی ، सिन्ध","sd"],["Swati","SiSwati","ss"],["Kikuyu","Gĩkũyũ","ki"],["Ewe","Eʋegbe","ee"],["Hausa","هَوُسَ","ha"],["Oromo","Oromoo","om"],["Fijian","Na Vosa Vakaviti","fj"],["Tigrinya","ትግርኛ","ti"],["Tsonga","Xitsonga","ts"],["Kashmiri","कश्मीरी / كشميري","ks"],["Venda","Tshivenda","ve"],["Sango","Sängö","sg"],["Kirundi","Kirundi","rn"],["Sesotho","Sesotho","st"],["Dzongkha","ཇོང་ཁ","dz"],["Cree","Nehiyaw","cr"],["Akan","Akana","ak"],["Tumbuka","chiTumbuka","tum"],["Luganda","Luganda","lg"],["Chichewa","Chi-Chewa","ny"],["Fula","Fulfulde","ff"],["Inupiak","Iñupiak","ik"],["Chamorro","Chamoru","ch"],["Twi","Twi","tw"],["Xhosa","isiXhosa","xh"],["Ndonga","Oshiwambo","ng"],["Sichuan Yi","ꆇꉙ","ii"],["Choctaw","Choctaw","cho"],["Marshallese","Ebon","mh"],["Afar","Afar","aa"],["Kuanyama","Kuanyama","kj"],["Hiri Motu","Hiri Motu","ho"],["Muscogee","Muskogee","mus"],["Kanuri","Kanuri","kr"],["Herero","Otsiherero","hz"]] diff --git a/index.html b/index.html index 5e12f7065..5fc846933 100644 --- a/index.html +++ b/index.html @@ -35,6 +35,7 @@ + @@ -101,6 +102,7 @@ + diff --git a/js/id/services/wikipedia.js b/js/id/services/wikipedia.js new file mode 100644 index 000000000..2d2a27a32 --- /dev/null +++ b/js/id/services/wikipedia.js @@ -0,0 +1,39 @@ +iD.wikipedia = function() { + var wiki = {}, + endpoint = 'http://en.wikipedia.org/w/api.php?'; + + wiki.search = function(lang, query, callback) { + lang = lang || 'en'; + d3.jsonp(endpoint.replace('en', lang) + + iD.util.qsString({ + action: 'query', + list: 'search', + srlimit: '10', + srinfo: 'suggestion', + format: 'json', + callback: '{callback}', + srsearch: query + }), function(data) { + if (!data.query) return console.log("resp", data); + callback(query, data.query.search.map(function(d) { + return d.title; + })); + }); + }; + + wiki.suggestions = function(lang, query, callback) { + lang = lang || 'en'; + d3.jsonp(endpoint.replace('en', lang) + + iD.util.qsString({ + action: 'opensearch', + namespace: 0, + suggest: '', + format: 'json', + callback: '{callback}', + search: query + }), function(d) { + callback(d[0], d[1]); + }); + }; + return wiki; +}; diff --git a/js/id/ui/preset/wikipedia.js b/js/id/ui/preset/wikipedia.js new file mode 100644 index 000000000..e1262b580 --- /dev/null +++ b/js/id/ui/preset/wikipedia.js @@ -0,0 +1,110 @@ +iD.ui.preset.wikipedia = function(field, context) { + + var event = d3.dispatch('change', 'close'), + wikipedia = iD.wikipedia(), + language = iD.data.wikipedia[0], + link, entity, lang, input; + + function i(selection) { + + var langcombo = d3.combobox() + .fetcher(function(value, __, cb) { + var v = value.toLowerCase(); + + cb(iD.data.wikipedia.filter(function(d) { + return d[0].toLowerCase().indexOf(v) >= 0 || + d[1].toLowerCase().indexOf(v) >= 0 || + d[2].toLowerCase().indexOf(v) >= 0; + }).map(function(d) { + return { value: d[1] }; + })); + }); + + var titlecombo = d3.combobox() + .fetcher(function(value, __, cb) { + + if (!value) value = context.entity(entity.id).tags.name || ''; + var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions; + + searchfn(language && language[2], value, function(query, data) { + cb(data.map(function(d) { + return { value: d }; + })); + }); + }); + + lang = selection.append('input') + .attr('type', 'text') + .attr('class', 'wiki-lang') + .on('blur', changeLang) + .on('change', changeLang) + .call(langcombo); + + title = selection.append('input') + .attr('type', 'text') + .attr('class', 'wiki-title') + .attr('id', 'preset-input-' + field.id) + .on('blur', change) + .on('change', change) + .call(titlecombo); + + link = selection.append('a') + .attr('class', 'wiki-link') + .attr('target', '_blank') + .text('→'); + } + + function changeLang() { + var value = lang.property('value').toLowerCase(); + console.log(value); + language = _.find(iD.data.wikipedia, function(d) { + return d[0].toLowerCase() === value || + d[1].toLowerCase() === value || + d[2].toLowerCase() === value; + }) || iD.data.wikipedia[0]; + + if (value !== language[0]) { + lang.property('value', language[1]); + } + + change(); + } + + function change() { + var t = {}; + var value = title.property('value'); + t[field.key] = value ? language[2] + ':' + value : ''; + event.change(t); + link.attr('href', 'http://' + language[2] + '.wikipedia.org/wiki/' + (value || '')); + } + + i.tags = function(tags) { + var m = tags[field.key] ? tags[field.key].match(/([^:]+):(.+)/) : null; + + // value in correct format + if (m && m[1] && m[2]) { + language = _.find(iD.data.wikipedia, function(d) { + return m[1] === d[2]; + }); + + if (language) lang.property('value', language[1]); + else lang.property('value', m[1]); + + title.property('value', m[2]); + link.attr('href', 'http://' + m[1] + '.wikipedia.org/wiki/' + m[2]); + + // unrecognized value format + } else { + lang.property('value', 'English'); + title.property('value', tags[field.key] || ''); + language = iD.data.wikipedia[0]; + link.attr('href', 'http://en.wikipedia.org/wiki/Special:Search?search=' + tags[field.key]); + } + }; + + i.entity = function(_) { + entity = _; + }; + + return d3.rebind(i, event, 'on'); +}; diff --git a/js/lib/d3.combobox.js b/js/lib/d3.combobox.js index 2d42aa08c..7efb58b49 100644 --- a/js/lib/d3.combobox.js +++ b/js/lib/d3.combobox.js @@ -139,7 +139,7 @@ d3.combobox = function() { match; for (var i = 0; i < data.length; i++) { - if (data[i].value.indexOf(value) === 0) { + if (data[i].value.toLowerCase().indexOf(value.toLowerCase()) === 0) { match = data[i].value; break; }