diff --git a/app/assets/javascripts/app/helpers/direction_detector.js b/app/assets/javascripts/app/helpers/direction_detector.js index ee149571865fcfeb31e0f11d178cbb11a1d051a7..768aeb8b3c6c78eab4a5822a07119c6e7fbb66a5 100644 --- a/app/assets/javascripts/app/helpers/direction_detector.js +++ b/app/assets/javascripts/app/helpers/direction_detector.js @@ -18,7 +18,7 @@ return false; } - var charCode = str.charCodeAt(0); + var charCode = this._fixedCharCodeAt(str, 0); if(charCode >= 1536 && charCode <= 1791) // Sarabic, Persian, ... return true; @@ -34,6 +34,12 @@ else if(charCode>=64256 && charCode<=64335) // Hebrew present return true; + else if(charCode>=68096 && charCode<=68184) // Kharoshthi + return true; + + else if(charCode>=67840 && charCode<=67871) // Phoenician + return true; + else if(charCode>=1792 && charCode<=1871) // Syriac return true; @@ -47,6 +53,39 @@ return true; return false; + }, + + // source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt + _fixedCharCodeAt: function(str, idx) { + str += ''; + var code, + end = str.length; + + var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + while ((surrogatePairs.exec(str)) != null) { + var li = surrogatePairs.lastIndex; + if (li - 2 < idx) { + idx++; + } + else { + break; + } + } + + if (idx >= end || idx < 0) { + return NaN; + } + + code = str.charCodeAt(idx); + + var hi, low; + if (0xD800 <= code && code <= 0xDBFF) { + hi = code; + low = str.charCodeAt(idx+1); + // Go one further, since one of the "characters" is part of a surrogate pair + return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; + } + return code; } }; })(); diff --git a/app/assets/javascripts/app/helpers/handlebars-helpers.js b/app/assets/javascripts/app/helpers/handlebars-helpers.js index bfc718ba3b7ee6a419319086b83f871dd17a36a2..1be1cd98d07969fc6e73d9b35f511a03975ee44d 100644 --- a/app/assets/javascripts/app/helpers/handlebars-helpers.js +++ b/app/assets/javascripts/app/helpers/handlebars-helpers.js @@ -59,8 +59,9 @@ Handlebars.registerHelper('hovercardable', function(person) { Handlebars.registerHelper('personImage', function(person, size, imageClass) { /* we return here if person.avatar is blank, because this happens when a * user is unauthenticated. we don't know why this happens... */ + if( !person.avatar && + !(person.profile && person.profile.avatar) ) return; var avatar = person.avatar || person.profile.avatar; - if( !avatar ) return; var name = ( person.name ) ? person.name : 'avatar'; size = ( !_.isString(size) ) ? "small" : size; diff --git a/app/assets/javascripts/jasmine-load-all.js b/app/assets/javascripts/jasmine-load-all.js index 8d777a10cceae7f99cb7a8199c1576dcb840ec02..eda5e0faab842a20e29e4038e4dc65849214bd01 100644 --- a/app/assets/javascripts/jasmine-load-all.js +++ b/app/assets/javascripts/jasmine-load-all.js @@ -6,6 +6,5 @@ //= require inbox //= require mobile //= require profile -//= require people //= require contact-list //= require sinon diff --git a/spec/javascripts/app/helpers/direction_detector_spec.js b/spec/javascripts/app/helpers/direction_detector_spec.js new file mode 100644 index 0000000000000000000000000000000000000000..6ade3d00b40c33e938a7687950a3ac7f6f69b15d --- /dev/null +++ b/spec/javascripts/app/helpers/direction_detector_spec.js @@ -0,0 +1,37 @@ +describe("app.helpers.txtDirection", function() { + context("#isRTL", function() { + beforeEach(function() { + this.samples = { + "ثم بغزو ناجازاكي الأوروبي بال, ": "rtl", // arabic + "×× ×‘×¨×™×ª מחליטה זכר, צ'ט לשון": "rtl", // hebrew + "ߊßߌßߎ": "rtl", // n'ko + "ð¨™ð¨œð¨ªð¨ð¨¢": "rtl", // Kharoshthi + "ð¤‚ð¤ƒð¤„ð¤…ð¤†ð¤‡ð¤ˆð¤‰ð¤Š": "rtl", // Phoenecian + "Ü«Ü Ü¡Ü": "rtl", //syriac + "Þ€Þ¦ÞÞ° ÞŽÞ®ÞÞ° Þ‡ÞªÞ…Þ Þ‡Þ¨ÞƒÞª": "rtl", // thaana + "ⴻⴼⴽⵄⵅⵆⵇ": "rtl", // Tifinagh + "ᚳᚴᚵᚶᚷᚸᚹᛅᛆᛇᛈᛉᛊᛋ": "ltr", // Runes + "ΘΛΞΠΣΦΨΩÎαβγζλφχψϖϗ": "ltr", // Greek + "経担è£æ´‹åºœæ™‚話家": "ltr", // Chinese + "Ðнёмал зÑнтынтиаÑ": "ltr", // Cyrillic + "उपेकà¥à¤· सोफ़à¥à¤Ÿà¤µà¥‡à¤° विचारशिलता": "ltr", // Hindi + "é¸ãå‰åˆ¶æ•°ãˆã»é•·æ˜¥ã‚»å": "ltr", // Japanese + "ascii text": "ltr", + }; + }); + + it("detects the right text direction", function() { + _.each(this.samples, function(dir, str) { + var result = app.helpers.txtDirection.isRTL(str); + if( result ) { + expect(dir).toEqual('rtl'); + } else { + expect(dir).toEqual('ltr'); + } + }); + }); + }); +}); + + +101 diff --git a/spec/javascripts/app/views/aspects_dropdown_view_spec.js b/spec/javascripts/app/views/aspects_dropdown_view_spec.js index 326d6a583c4421027e0ef77a39b8d1e94df9642b..605a92df31a6d5bec4daf90d6b184c448f103c96 100644 --- a/spec/javascripts/app/views/aspects_dropdown_view_spec.js +++ b/spec/javascripts/app/views/aspects_dropdown_view_spec.js @@ -1,10 +1,15 @@ describe("app.views.AspectsDropdown", function(){ beforeEach(function() { spec.loadFixture("bookmarklet"); - Diaspora.I18n.load({ + Diaspora.I18n.reset({ 'aspect_dropdown': { - 'select_aspects': "Select aspects" - }); + 'select_aspects': "Select aspects", + 'all_aspects': "All Aspects", + 'toggle': { + 'zero': "Select aspects", + 'one': "In <%= count %> aspect", + 'other': "In <%= count %> aspects" + }}}); this.view = new app.views.AspectsDropdown({el: $('.aspect_dropdown')}); }); diff --git a/spec/javascripts/app/views/poll_view_spec.js b/spec/javascripts/app/views/poll_view_spec.js index d2b30e889b3a6fcbd9ab4236f9c2b0cc62921828..ee514316520996d6cc35d6c7f7ede40388fbf0de 100644 --- a/spec/javascripts/app/views/poll_view_spec.js +++ b/spec/javascripts/app/views/poll_view_spec.js @@ -29,7 +29,7 @@ describe("app.views.Poll", function(){ this.view.vote(answer.id); - var obj = jasmine.Ajax.requests.mostRecent().params); + var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params); expect(obj.poll_id).toBe(poll.poll_id); expect(obj.poll_answer_id).toBe(answer.id); })