Preserve existing Wikipedia language (fixes #1868)

This commit is contained in:
John Firebaugh
2013-10-09 15:36:28 -07:00
parent ba3b53846f
commit 965fb47680
4 changed files with 65 additions and 15 deletions
+11 -15
View File
@@ -2,7 +2,6 @@ iD.ui.preset.wikipedia = function(field, context) {
var event = d3.dispatch('change'),
wikipedia = iD.wikipedia(),
language = iD.data.wikipedia[0],
link, entity, lang, title;
function i(selection) {
@@ -26,7 +25,7 @@ iD.ui.preset.wikipedia = function(field, context) {
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) {
searchfn(language()[2], value, function(query, data) {
cb(data.map(function(d) {
return { value: d };
}));
@@ -38,7 +37,8 @@ iD.ui.preset.wikipedia = function(field, context) {
lang.enter().append('input')
.attr('type', 'text')
.attr('class', 'wiki-lang');
.attr('class', 'wiki-lang')
.value('English');
lang
.on('blur', changeLang)
@@ -68,18 +68,17 @@ iD.ui.preset.wikipedia = function(field, context) {
.attr('class', 'icon out-link');
}
function changeLang() {
function language() {
var value = lang.value().toLowerCase();
language = _.find(iD.data.wikipedia, function(d) {
return _.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.value(language[1]);
}
function changeLang() {
lang.value(language()[1]);
change();
}
@@ -97,13 +96,12 @@ iD.ui.preset.wikipedia = function(field, context) {
// Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
value = m[2].replace(/_/g, ' ');
value = value.slice(0, 1).toUpperCase() + value.slice(1);
language = newlanguage;
lang.value(language[0]);
lang.value(newlanguage[0]);
}
t[field.key] = value ? language[2] + ':' + value : undefined;
t[field.key] = value ? language()[2] + ':' + value : undefined;
event.change(t);
link.attr('href', 'http://' + language[2] + '.wikipedia.org/wiki/' + (value || ''));
link.attr('href', 'http://' + language()[2] + '.wikipedia.org/wiki/' + (value || ''));
}
i.tags = function(tags) {
@@ -121,9 +119,7 @@ iD.ui.preset.wikipedia = function(field, context) {
// unrecognized value format
} else {
lang.value('English');
title.value(tags[field.key] || '');
language = iD.data.wikipedia[0];
link.attr('href', 'http://en.wikipedia.org/wiki/Special:Search?search=' + tags[field.key]);
}
};
+4
View File
@@ -37,7 +37,9 @@
<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>
@@ -103,6 +105,7 @@
<script src='../js/id/ui/preset/input.js'></script>
<script src='../js/id/ui/preset/check.js'></script>
<script src='../js/id/ui/preset/combo.js'></script>
<script src='../js/id/ui/preset/wikipedia.js'></script>
<script src='../js/id/actions.js'></script>
<script src='../js/id/actions/add_member.js'></script>
@@ -258,6 +261,7 @@
<script src="spec/ui/cmd.js"></script>
<script src="spec/ui/preset/access.js"></script>
<script src="spec/ui/preset/wikipedia.js"></script>
<script src="spec/geo.js"></script>
<script src="spec/taginfo.js"></script>
+3
View File
@@ -82,6 +82,9 @@
<script src="spec/ui/confirm.js"></script>
<script src="spec/ui/cmd.js"></script>
<script src="spec/ui/preset/access.js"></script>
<script src="spec/ui/preset/wikipedia.js"></script>
<script src="spec/geo.js"></script>
<script src="spec/taginfo.js"></script>
<script src="spec/util.js"></script>
+47
View File
@@ -0,0 +1,47 @@
describe('iD.ui.preset.wikipedia', function() {
var selection, field;
beforeEach(function() {
selection = d3.select(document.createElement('div'));
field = iD().presets().field('wikipedia');
});
it('recognizes lang:title format', function() {
var wikipedia = iD.ui.preset.wikipedia(field, {});
selection.call(wikipedia);
wikipedia.tags({wikipedia: 'en:Title'});
expect(selection.selectAll('.wiki-lang').value()).to.equal('English');
expect(selection.selectAll('.wiki-title').value()).to.equal('Title');
expect(selection.selectAll('.wiki-link').attr('href')).to.equal('http://en.wikipedia.org/wiki/Title');
});
it('sets a new value', function() {
var wikipedia = iD.ui.preset.wikipedia(field, {});
selection.call(wikipedia);
wikipedia.on('change', function(tags) {
expect(tags).to.eql({wikipedia: undefined});
});
selection.selectAll('.wiki-lang').value('Deutsch');
happen.once(selection.selectAll('.wiki-lang').node(), {type: 'change'});
wikipedia.on('change', function(tags) {
expect(tags).to.eql({wikipedia: 'de:Title'});
});
selection.selectAll('.wiki-title').value('Title');
happen.once(selection.selectAll('.wiki-title').node(), {type: 'change'});
});
it('preserves existing language', function() {
selection.call(iD.ui.preset.wikipedia(field, {}));
selection.selectAll('.wiki-lang').value('Deutsch');
var wikipedia = iD.ui.preset.wikipedia(field, {});
selection.call(wikipedia);
wikipedia.tags({});
expect(selection.selectAll('.wiki-lang').value()).to.equal('Deutsch');
});
});