mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 01:02:58 +00:00
wikipedia input field
This commit is contained in:
1
build.js
1
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'),
|
||||
|
||||
24
css/app.css
24
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;
|
||||
|
||||
@@ -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]
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@
|
||||
},
|
||||
"wikipedia": {
|
||||
"key": "wikipedia",
|
||||
"type": "text",
|
||||
"type": "wikipedia",
|
||||
"icon": "wikipedia",
|
||||
"universal": true,
|
||||
"label": "Wikipedia"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"key": "wikipedia",
|
||||
"type": "text",
|
||||
"type": "wikipedia",
|
||||
"icon": "wikipedia",
|
||||
"universal": true,
|
||||
"label": "Wikipedia"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@
|
||||
"email",
|
||||
"url",
|
||||
"radio",
|
||||
"textarea"
|
||||
"textarea",
|
||||
"wikipedia"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
|
||||
1
data/wikipedia.json
Normal file
1
data/wikipedia.json
Normal file
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
|
||||
39
js/id/services/wikipedia.js
Normal file
39
js/id/services/wikipedia.js
Normal 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;
|
||||
};
|
||||
110
js/id/ui/preset/wikipedia.js
Normal file
110
js/id/ui/preset/wikipedia.js
Normal 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');
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user