Позволю себе прорекламировать свой модуль MIME Info и патч для модуля Libraries, которые позволяет выкачивать, перемещать и обновлять библиотеки с помощью Drush. :)
Смотрится — это одно. Мне, например, в том же PSR не нравится отступ в 4 пробела, в Drupal — перенос блочных операторов (if — else, try — catch) на новую строку и много других правил… Тут важно понимать, что они были приняты и одобрены тысячами довольно не глупых людей со всего мира не просто так. Если ты используешь какую-то систему, то обязан следовать тем правилам, которые заложены в ее идеологии. Иначе же — должно разрабатываться собственное решение (CMS/CMF/Framework), собственные стандарты и правила.
Хотя есть, правда, еще один выход — контрибьютинг — предложение своих, обоснованных, идей и их реализацию сообществу разработчиков (если open source, как в случае с Drupal).
Не самый приятный проект. Стандарты кодирования, лично мне, не по душе. Да и качество особо не радует, взяв, например, этот метод или этот кусок, в котором два раза выполняется функция, вместо сохранения значения в переменную (какая там производительность, принцип DRY, ааууу?). Также можно заметить классы, якобы ООП подход, да вот только непонятно какие сущности пытались описать: одни статические, независимые друг от друга, методы, а некоторые, вроде и не статические но не несут в себе реализации экземпляра (пусть и singleton). И это только за минуту просмотра репозитория со случайно открытыми файлами…
Помимо всего этого, данный проект — это «велосипед» в котором придется разбираться. Уже представляю ситуацию с использованием на продакшене, где этот самый Themosis ломается и программист погружается в бесполезный дебаг с крепким словцом.
Писал с iPad, ночью, по-этому так «сухо». Сейчас попробую все разжевать.
Во-первых, не i18n (internationalization), а всего лишь i10n (localization). Не путайте.
Во-вторых, на GitHub у вас написанно:
Super-simple gettext translation in pure JS
и, хочу я сказать, что Gettext тут не при чем.
В-третьих, у инструментов, перечисленных вверху поста, нет зависимостей. Библиотека/фреймворк, под которую написан плагин/дополнение не может быть зависимостью, а только ноборот.
Код вашей библиотеки с моими комментариями
// Неправильное определение переменной: нет ключевого
// слова "var" - несоблюдение строгих стандартов JS.
pojs = {
// Непонятное имя свойства
_l: null,
// Непонятное имя свойства
_r: false,
// Непонятное имя свойства
_p: {},
// Непонятное имя параметра
init: function(l) {
this._l = l;
this._load();
},
_: function(key, args) {
// Избыточное выражение.
// Проще:
// this._p[key] || key
//
// Неправильное форматирование кода. Не только здесь, повсеместно.
// Рекомендую к прочтению JS Style Guide: https://github.com/BR0kEN-/javascript
//
// В данном случае лучше так:
// var t = this._p[key] || key,
// a;
var t = this._p.hasOwnProperty(key) ? this._p[key] : key, a;
// Неправильная проверка. "args" может быть строкой и удовлетворять условие.
// Пример:
// var args = 'string';
//
// if (args) {
// for (var arg in args) {
// // args[arg] = s
// // args[arg] = t
// // args[arg] = r
// // args[arg] = i
// // args[arg] = n
// // args[arg] = g
// }
// }
if (args) {
for (a in args) {
t = t.replace(/%s/, args[a]);
}
}
return t;
},
// Неправильный подход. Необходимо использовать
// событие "load" для XMLHttp объекта.
//
// Отсутствие проверки на тип.
// Пример:
// pojs.ready('fucking code');
// Uncaught TypeError: string is not a function
ready: function(cb) {
var _t = this, i = setInterval(function() {
if (_t._r) {
cb();
clearInterval(i);
}
}, 10);
},
_load: function() {
// "'localStorage' in window" и "window['localStorage'] !== null" - одно и то же.
var _t = this, x, lsa = 'localStorage' in window && window['localStorage'] !== null, cache = null;
if (_t._l) {
if (lsa) {
cache = localStorage.getItem('pojs_' + _t._l);
if (cache) {
_t._p = JSON.parse(cache);
_t._r = true;
return;
}
}
x = new XMLHttpRequest();
x.onreadystatechange = function() {
// Избыточная вложенность и неправильное обращение к объекту.
//
// Выражение записывается так:
// if (this.readyState === 4 && this.status === 200) {
// // actions
// }
//
// Или же еще проще:
// if (this.response) {
// // actions
// }
//
// Помимо этого, в IE8, данный код обрастет ошибками:
// - отсутствие объекта XMLHttpRequest;
// - отсутствие объекта console.
if (x.readyState === 4) {
if (x.status === 200) {
// Выше, почему-то, есть проверка на существование
// localStorage, а тут подразумевается что объект
// будет во что бы то ни стало?
localStorage.setItem('pojs_' + _t._l, x.responseText);
_t._p = JSON.parse(x.responseText);
} else {
console.error('Can not load JSON from ' + _t._l);
}
_t._r = true;
}
};
x.open('GET', this._l, true);
x.send();
} else {
_t._r = true;
}
}
};
Воркфлоу приблизительно такой:
П.С. Завтра опубликую 7.x-1.2 версию, в которой любая структура (поля, группы полей, модули виджетов etc.) бандла будет подтягиватся автоматически.
Рад что Хабр понемногу Друпализируется!
Хотя есть, правда, еще один выход — контрибьютинг — предложение своих, обоснованных, идей и их реализацию сообществу разработчиков (если open source, как в случае с Drupal).
Совет: почитайте о кодинг стандартах Drupal и используйте для проверки CodeSniffer (или MessDetector). Отчет с ошибками форматирования будет большой.
P.S. Отступы в сорцах Drupal — 2 пробела.
jojo97, статья-то другая и автор тоже, а вот материал один, ничего нового. Даже не о чем на эту тему дискутировать.
<sarcasm>
Даешь по статье о HTML Import раз в неделю. Уверен, еще много кто в своих блогах об этом написал.</sarcasm>
З.Ы. На данном этапе развития — бесполезная фича.
Помимо всего этого, данный проект — это «велосипед» в котором придется разбираться. Уже представляю ситуацию с использованием на продакшене, где этот самый Themosis ломается и программист погружается в бесполезный дебаг с крепким словцом.
Во-первых, не i18n (internationalization), а всего лишь i10n (localization). Не путайте.
Во-вторых, на GitHub у вас написанно: и, хочу я сказать, что Gettext тут не при чем.
В-третьих, у инструментов, перечисленных вверху поста, нет зависимостей. Библиотека/фреймворк, под которую написан плагин/дополнение не может быть зависимостью, а только ноборот.
P.S. Создал pull request на GitHub.
Да еще и несоблюдение JS стандартов.
~5 ссылок и информация о том, что подход к выборке по селектору может отличатся от браузера к браузеру — это не статья.
Для сравнения:
P.S. А вы мастер скриншотов :) Если, вдруг, не знали, то скриншот делается нажатием кнопки «Home» и «Блокировать».