Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix persian characters on chrome and safari #3707

Merged
merged 10 commits into from
Jan 4, 2017
2 changes: 1 addition & 1 deletion modules/services/osm.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { osmEntity, osmNode, osmRelation, osmWay } from '../osm/index';
import { utilDetect } from '../util/detect';
import { utilRebind } from '../util/rebind';


var dispatch = d3.dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded'),
useHttps = window.location.protocol === 'https:',
protocol = useHttps ? 'https:' : 'http:',
Expand Down Expand Up @@ -70,6 +69,7 @@ function getTags(obj) {
var attrs = elems[i].attributes;
tags[attrs.k.value] = attrs.v.value;
}

return tags;
}

Expand Down
1 change: 0 additions & 1 deletion modules/ui/entity_editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { uiTagReference } from './tag_reference';
import { uiPreset } from './preset';
import { utilRebind } from '../util/rebind';


export function uiEntityEditor(context) {
var dispatch = d3.dispatch('choose'),
state = 'select',
Expand Down
117 changes: 117 additions & 0 deletions modules/util/svg_paths_arabic_fix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
const chars = {
// madda above alef
1570: {initial: "آ‎", isolated: "ﺁ", medial: "ﺁ", final: "ﺂ" },

// hamza above and below alef
1571: { initial: "أ", isolated: "ﺃ", medial: "", final: "ﺄ" },
// 1572 is ؤ
1573: { initial: "إ", isolated: "ﺇ", medial: "", final: "ﺈ" },
// 1574 is ئ
1575: {initial: "ا", isolated: "ا", medial: "", final: "ﺎ" },
1576: {initial: "ﺑ", isolated: "ﺏ", medial: "ﺒ", final: "ﺐ" },

// 1577 ة
1577: {initial: "", isolated: "ة", medial: "", final: "ﺔ" },

1578: {initial: "ﺗ", isolated: "ﺕ", medial: "ﺘ", final: "ﺖ" },
1579: {initial: "ﺛ", isolated: "ﺙ", medial: "ﺜ", final: "ﺚ" },
1580: {initial: "ﺟ", isolated: "ﺝ", medial: "ﺠ", final: "ﺞ" },
1581: {initial: "ﺣ", isolated: "ﺡ", medial: "ﺤ", final: "ﺢ" },
1582: {initial: "ﺧ", isolated: "ﺥ", medial: "ﺨ", final: "ﺦ" },
1583: {initial: "ﺩ", isolated: "ﺩ", medial: "", final: "ﺪ" },
1584: {initial: "ﺫ", isolated: "ﺫ", medial: "", final: "ﺬ" },
1585: {initial: "ﺭ", isolated: "ﺭ", medial: "", final: "ﺮ" },
1586: {initial: "ﺯ", isolated: "ﺯ", medial: "", final: "ﺰ" },
1688: {initial: "ﮊ", isolated: "ﮊ", medial: "", final: "ﮋ" },
1587: {initial: "ﺳ", isolated: "ﺱ", medial: "ﺴ", final: "ﺲ" },
1588: {initial: "ﺷ", isolated: "ﺵ", medial: "ﺸ", final: "ﺶ" },
1589: {initial: "ﺻ", isolated: "ﺹ", medial: "ﺼ", final: "ﺺ" },
1590: {initial: "ﺿ", isolated: "ﺽ", medial: "ﻀ", final: "ﺾ" },
1591: {initial: "ﻃ", isolated: "ﻁ", medial: "ﻄ", final: "ﻂ" },
1592: {initial: "ﻇ", isolated: "ﻅ", medial: "ﻈ", final: "ﻆ" },
1593: {initial: "ﻋ", isolated: "ﻉ", medial: "ﻌ", final: "ﻊ" },
1594: {initial: "ﻏ", isolated: "ﻍ", medial: "ﻐ", final: "ﻎ" },

// 1595 ػ - may be very rare

1601: {initial: "ﻓ", isolated: "ﻑ", medial: "ﻔ", final: "ﻒ" },
1602: {initial: "ﻗ", isolated: "ﻕ", medial: "ﻘ", final: "ﻖ" },
1604: {initial: "ﻟ", isolated: "ﻝ", medial: "ﻠ", final: "ﻞ" },
1605: {initial: "ﻣ", isolated: "ﻡ", medial: "ﻤ", final: "ﻢ" },
1606: {initial: "ﻧ", isolated: "ﻥ", medial: "ﻨ", final: "ﻦ" },
1607: {initial: "ﻫ", isolated: "ﻩ", medial: "ﻬ", final: "ﻪ" },
1608: {initial: "ﻭ", isolated: "ﻭ", medial: "", final: "ﻮ" },

// 1609 ى
1609: {initial: "ﯨ", isolated: "ﻯ", medial: "ﯩ", final: "ﻰ" },
// 1610 ي
1610: {initial: "ﻳ", isolated: "ﻱ", medial: "ﻴ", final: "ﻲ" },
// short vowel sounds / tashkil markings

1662: {initial: "ﭘ", isolated: "ﭖ", medial: "ﭙ", final: "ﭗ" },

1670: {initial: "ﭼ", isolated: "ﭺ", medial: "ﭽ", final: "ﭻ" },
1603: {initial: "ﻛ", isolated: "ﻙ", medial: "ﻜ", final: "ﻚ" },
1705: {initial: "ﻛ", isolated: "ﮎ", medial: "ﻜ", final: "ﮏ" },
1711: {initial: "ﮔ", isolated: "ﮒ", medial: "ﮕ", final: "ﮓ" },
1740: {initial: "ﻳ", isolated: "ﻯ", medial: "ﻴ", final: "ﻰ" },
5000: {initial: "ﻻ", isolated: "ﻻ", medial: "", final: "ﻼ" }
};

export function fixArabicScriptTextForSvg(inputText){
let context = true;
let ret = '';
let rtlBuffer = [];

for(let i = 0, l = inputText.length; i < l; i++){
let code = inputText[i].charCodeAt(0);
let nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
if(!chars[code]){
if (code === 32 && rtlBuffer.length) {
// whitespace
rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
} else {
// non-RTL character
ret += rtlBuffer.reverse().join('') + inputText[i];
rtlBuffer = [];
}
continue;
}
if(context){
if(i == l - 1){
rtlBuffer.push(chars[code].isolated);
} else {
// special case for لا
if(code == 1604 && nextCode == 1575){
rtlBuffer.push(chars[5000].initial);
i++;
context = true;
continue;
}

rtlBuffer.push(chars[code].initial);
}
} else {
if(i == l - 1){
rtlBuffer.push(chars[code].final);
} else {
// special case for ﻼ
if(code == 1604 && nextCode == 1575){
rtlBuffer.push(chars[5000].final);
i++;
context = true;
continue;
}
if(chars[code].medial == ''){
rtlBuffer.push(chars[code].final);
} else{
rtlBuffer.push(chars[code].medial);
}
}
}
context = (chars[code].medial == '');
}
ret += rtlBuffer.reverse().join('');

return ret;
}
9 changes: 8 additions & 1 deletion modules/util/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as d3 from 'd3';
import { t, textDirection } from './locale';
import { utilDetect } from './detect';
import { remove as removeDiacritics } from 'diacritics';

import { fixArabicScriptTextForSvg } from '../util/svg_paths_arabic_fix';

export function utilTagText(entity) {
return d3.entries(entity.tags).map(function(e) {
Expand Down Expand Up @@ -66,6 +66,13 @@ export function utilDisplayName(entity) {
name = network + ' ' + name;
}
}

var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1
var arabicRegex = /[\u0600-\u06FF]/g
if(!isFirefox && name && (entity.tags.highway || entity.tags.railway) && arabicRegex.test(name)){
name = fixArabicScriptTextForSvg(name);
}

return name;
}

Expand Down