wikipedia input field

This commit is contained in:
Ansis Brammanis
2013-04-01 15:55:37 -04:00
parent f6111fe04b
commit e82df13a28
11 changed files with 190 additions and 10 deletions

View File

@@ -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'),

View File

@@ -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;

View File

@@ -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]
}
};

View File

@@ -400,7 +400,7 @@
},
"wikipedia": {
"key": "wikipedia",
"type": "text",
"type": "wikipedia",
"icon": "wikipedia",
"universal": true,
"label": "Wikipedia"

View File

@@ -1,7 +1,7 @@
{
"key": "wikipedia",
"type": "text",
"type": "wikipedia",
"icon": "wikipedia",
"universal": true,
"label": "Wikipedia"
}
}

View File

@@ -28,7 +28,8 @@
"email",
"url",
"radio",
"textarea"
"textarea",
"wikipedia"
],
"required": true
},

1
data/wikipedia.json Normal file

File diff suppressed because one or more lines are too long

View File

@@ -35,6 +35,7 @@
<script src='js/id/id.js'></script>
<script src='js/id/util.js'></script>
<script src='js/id/services/taginfo.js'></script>
<script src='js/id/services/wikipedia.js'></script>
<script src='data/data_dev.js'></script>
@@ -101,6 +102,7 @@
<script src='js/id/ui/preset/input.js'></script>
<script src='js/id/ui/preset/radio.js'></script>
<script src='js/id/ui/preset/textarea.js'></script>
<script src='js/id/ui/preset/wikipedia.js'></script>
<script src='js/id/ui/intro/navigation.js'></script>
<script src='js/id/ui/intro/point.js'></script>

View File

@@ -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;
};

View File

@@ -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');
};

View File

@@ -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;
}