All streams
Search
Write a publication
Pull to refresh
-1
0
Антон @dpigo

Фулстек веб-разработчик с уклоном во фронтенд

Send message
Из практики: заливал треки с компа во flac, потом сохранял через приложение на планшете — на выходе mp3 (причем без тегов и с левым названием) + xml.
Используйте TOR c точкой выхода в США
16 гигов хватает на: Музыка во flac, фотки и видео, бекапы и дистры двух прошивок.
Спасибо, пригодится! Как раз недавно лепил костыль для подобного случая.
А если набить 1000 покажут мультфильм!
забыл девайсы указать: nexus10, sgs2
Долгое время сидел на AOSP потом на MIUI, потом пересел на гибридный AOKP+CM+PA (ReVolt). Беда AOKP в том что в него понапихано слишком уж много и слишком не аккуратно. Сейчас использую чистый PA.
Решето! <irony>Наверное они просто выполняют оборонный заказ: журнал это ханипот для будущих военнослужащих кибервойск, а вы все спалили!</irony> Хотя вариант с раздолбайством более вероятен.
*посыпаю голову пеплом не так понял вопрос*
Спасибо за информацию, тогда действительно дело осталось за новой ревизией Nexus 7!
Этот вариант подразумевает, что у вас уже есть ссылки, чтобы их вставлять. А предлагается сократить как раз сам процесс получения этих ссылок до драг-н-дропа файлов прямо в редактор на хабре, если я правильно понял.
Ну это уже лирика.

Главное что
а) функции и процедуры теперь используются по назначению — не для разметки кода, а для повторного использования,
б) мы не делаем много лишних проходов по DOM,
в) у нас нет множества циклов, которым нужно подбирать новые имена переменных для итерации
г) не нужно возиться с тоннами статичного css,
д) ну и худо-бедно код документирован.

Удачи в дальнейшей разработке!
Немного поправил код, послал пул реквест. Давно не писал на vanilla.js, местами тупил, но вроде осилил.

Скрытый текст
/* Add css rules to specified selector */
function addCSSRule(selector, rules, sheet) {
    sheet = sheet || document.styleSheets[0];
    if (sheet.insertRule) {
        sheet.insertRule(selector + '{' + rules + '}');
    } else {
        sheet.addRule(selector, rules);
    }
}
/* Return human-friendly declension of provided numbers */
function declOfNum(number, titles) {
    cases = [2, 0, 1, 1, 1, 2];
    return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
}
/* Return chidren nodes of an element with a specified class name */
function getChildrenByClassName(element, className) {
    var children = [];
    for (var i = 0; i < element.childNodes.length; i++) {
        if (element.childNodes[i].className == className) {
            children.push(element.childNodes[i]);
        }
    }
    return children;
}
/* Hide single nodeList */
function hideNode (nodes) {
    for (var i = 0; i < nodes.length; i++) {
        var node = nodes[i];
        node.style.display = 'none';
    }
}
/* Hide nodeLists provided as array */
function hideNodes (nodes) {
    if( Object.prototype.toString.call( nodes ) === '[object Array]' ) {
        for (var i = 0; i < nodes.length; i++) {
            hideNode(nodes[i]);
        }
    }
    else {
        hideNode(nodes);
    }
}
/* Toggle visibility of provided elements */
function toggleElements (elements) {
    for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        element.style.display = (element.style.display != 'none' ? 'none' : 'block');
    }
}
/* Create a button ( span.buttons > a.button ) */
function createBtn (className, value, onclick) {
    className = className || 'button';
    value = value || 'Button';
    onclick = onclick || function (event) {};

    var newContainer = document.createElement('span');
        newContainer.className = 'buttons';
    var newBtn = document.createElement('a');
        newBtn.className = className + ' button';
        newBtn.appendChild(document.createTextNode(value));
        newBtn.href="#";
        newBtn.onclick = onclick;
        newContainer.appendChild(newBtn);
    return newContainer;
}
/* Replies button event handler */
function commentsBtnClick (event) {
    event.preventDefault();
    var btn = event.currentTarget;
    var comments = btn.parentNode.parentNode.parentNode.parentNode.querySelectorAll('.reply_comments');
    toggleElements(comments);
}

/* C-style Main() =) */
(function(){
    /* Sets of {NodeList} elements to operate with */
    var allReplies = document.querySelectorAll('.reply_comments');
    var sidebarImgs = document.querySelectorAll('.sidebar_right > .banner_300x500, .sidebar_right > #htmlblock_placeholder');
    var contentImgs = document.querySelectorAll('.content img, .message img');

    /* Hide all images and nested replies by default */
    hideNodes([allReplies, sidebarImgs, contentImgs]);

    /* Add button to toggle images visibility */
    var newImgBtn = createBtn('habraimage', '◄ Показать изображения', function (event) {event.preventDefault(); toggleElements(contentImgs);});
    document.querySelectorAll('.main_menu')[0].appendChild(newImgBtn);
    /* Make buton fixed */
    addCSSRule('.habraimage', 'position:fixed; right: 6%; z-index: 1;');

    /* Add buttons to toggle comments visibility */
    var comments = document.querySelectorAll('.comments_list > .comment_item'),
        comment, combody;
    for (var i = 0; i < comments.length; i++) {
        comment = comments[i];
        var replies = comment.querySelectorAll('.reply_comments .comment_body');
        if (replies.length > 0) {
            combody = getChildrenByClassName(comment, 'comment_body')[0];
            replylink = getChildrenByClassName(combody, 'reply')[0];
            if (combody) {
                var newBtn = createBtn('hidereplies', replies.length + declOfNum(replies.length, [' ответ', ' ответа', ' ответов']), commentsBtnClick);
                replylink.appendChild(newBtn);
            }
        }
    }
})();

Комментарии очень даже нужны. Например без комментариев в статье кусок кода
            function declOfNum(number, titles) {
                cases = [2, 0, 1, 1, 1, 2];
                return titles[(number % 100 > 4 && number % 100 < 20) ? 2 : cases[(number % 10 < 5) ? number % 10 : 5]];
            }

тяжело воспринять при первом прочтении — глаза мозолят «магические числа». Опять же о какой семантике может идти речь если в наличии функции hideReplies() и hideR()?
По-моему все возможные частные случаи перечислять более затратно, чем отключить все, а потом включить то что действительно необходимо ( белые vs черные списки). В вашем случае это 9 проходов по DOM против 2х.
Из большинства объявленных функций повторно у вас используется если я не ошибаюсь только одна. Остальное — линейное программирование. Для семантики и отладки на данном уровне комментариев вполне достаточно.
Чтобы вызвать функцию сразу после ее объявления можно делать так:
(function () {
/*код */
})();

И разве не короче было бы сделать
document.querySelectorAll('.content img');

вместо того чтобы перечислять все возможные варианты вложенности?
Какая занятная у вас избирательность в подходе к литовке мата.
Вряд ли они заново переводили и переозвучивали Вавилон 5. Скорее всего взяли то, что в свое время крутили по ТВ, а там действительно было много косяков в переводе.
Оформление статьи (набрана сплошным текстом без разбиения на части и без иллюстраций) вполне тянет на звание спагетти!
Возможно вкусно, но уж очень трудно осилить и переварить.
Наша компания занимается локализацией ПО… биллионы

В лучших традициях отечественной локализации!

Сегодня мы хотим поделиться инфографикой, которая наглядно показывает...

Она показывает какую-то неведомую фигню: люди, деньги все в кучу.

Information

Rating
Does not participate
Location
Сербия
Date of birth
Registered
Activity