1. JavaScript / Говнокод #3404

    +157

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    // ==UserScript==
    // @name           govnokod.ru.user.js
    // @description    highlight for new comments
    // @author         [email protected]
    // @include        http://govnokod.ru/*
    // ==/UserScript==
    
    if(!jQuery.cookie)
    jQuery.cookie = function(name, value, options) {
        if (typeof value != 'undefined') { // name and value given, set cookie
            options = options || {};
            if (value === null) {
                value = '';
                options.expires = -1;
            }
            var expires = '';
            if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
                var date;
                if (typeof options.expires == 'number') {
                    date = new Date();
                    date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
                } else {
                    date = options.expires;
                }
                expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
            }
            var path = options.path ? '; path=' + (options.path) : '';
            var domain = options.domain ? '; domain=' + (options.domain) : '';
            var secure = options.secure ? '; secure' : '';
            document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
        } else { // only name given, get cookie
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
    };
    
    var there_href = document.location.href.match(/govnokod\.ru\/(\d+)/);
    if ( there_href ) // in topic
    	$(document).ready(function() {
    		var govnokod_n = there_href[1];
    		var cookiename = 'gk'+govnokod_n
    		var lastvisit = new Date(parseInt($.cookie(cookiename)));
    		var now = new Date();
    		var comments = $(".hcomment abbr").filter(function(index,elem) {
    			var date=new Date(elem.title.replace("T"," ").replace(/\+(\d\d):(\d\d)$/," GMT+$1$2"));
    			return date>lastvisit;
    		});
    		for (var i=0;i<comments.length;i++)
    		{
    			var elem = comments[i];
    			var header = elem.parentElement;
    			var block = elem.parentElement.parentElement;
    			block.style.background = '#FACE8D';
    			var anchor = document.createElement("a");
    			anchor.setAttribute('name','new_'+i);
    			block.insertBefore(anchor,block.firstChild);
    			
    			var prevlink = document.createElement("a");
    			if (i!=0)
    				prevlink.setAttribute('href','#new_'+(i-1));
    			prevlink.appendChild(document.createTextNode('⟵'));
    			header.insertBefore(prevlink,elem.nextSibiling);
    			
    			header.insertBefore(document.createTextNode(' '),elem.nextSibiling);
    			
    			var nextlink = document.createElement("a");
    			if (i!=comments.length-1)
    				nextlink.setAttribute('href','#new_'+(i+1));
    			nextlink.appendChild(document.createTextNode('⟶'));
    			header.insertBefore(nextlink,elem.nextSibiling);
    
    		}
    		
    		var new_comments_count = document.createElement("a");
    		if (comments.length)
    			new_comments_count.setAttribute('href','#new_0');
    		new_comments_count.appendChild(document.createTextNode(''+comments.length+' новых'));
    		var comments_count = $(".enrty-comments-count");
    		comments_count.text(comments_count.text().replace(/\)$/,', '));
    		comments_count.append(new_comments_count);
    		comments_count.append(')');
    		$.cookie(cookiename, now.valueOf(), { 'expires': 3 }); //помним, что имеется ограничение на размер куков.
    	});

    Наговнокодил подсвечивалку новых комментариев для говногод.ру. Смесь из обычного DOM и тутошнего jQuery. Сохранить как govnokod.ru.user.js. Тестировал только в опере.

    Запостил: legolegs, 06 Июня 2010

    Комментарии (17) RSS

    • 1) что за ебанутая манера getter и setter пихать в одну функцию?
      2)
      // @include http://govnokod.ru/*
      document.location.href.match(/govnokod\.ru\/(\d+)/)
      3) ".enrty-comments-count"
      Ответить
      • 1) jQuery.cookie не мой, я просто скопипастил.
        2) благодаря "@include" скрипт не выполняется для остальных сайтов. Оптимизация, однако
        3) все претензии к страйкеру.
        Ответить
        • >1) jQuery.cookie не мой, я просто скопипастил.
          ну начинается, "я только подобрал, размял и прилепил"
          (я принял обет молчать о качестве кода использующего jQuery, чтобы не вызывать сотни баттхёрта)
          2) а) матчишь location.href дважды, б) первый раз теряешь www. в) второй раз используешь замшелый IE3-specific document.location г) location.pathname же
          3) вот щас придет страйкер и легким движением руки поломает все копии твоего скрипта, если они вообще работали (прямо здесь match() возвращает null)
          Ответить
          • >ну начинается, "я только подобрал, размял и прилепил"
            А ежели код, скажем, на си, то вы тоже придираетесь к содержимому stdio.h?
            >я принял обет молчать о качестве кода использующего jQuery
            Часть кода не использует jQuery, не думаю, что это пошло на пользу этой части.
            >матчишь location.href дважды
            Второй раз в основном с целью получить номер говнокода. А @include - это стандарт вообще-то.
            >первый раз теряешь www
            "www" не нужно.
            >location.pathname там всёравно слеш выкусывать и вычищать фидбурнеровский мусор.
            >вот щас придет страйкер и легким движением руки поломает все копии твоего скрипта
            Это особенность юзерскриптов. Покажи юзерскрипт, которые бы не ломался.
            Ответить
            • >код, скажем, на си, то вы тоже придираетесь к содержимому stdio.h?
              Да хоть на C++, лишь бы случайным говном из интернетов не оказался. Назвался автором - нагибайся %)

              >Часть кода не использует jQuery, не думаю, что это пошло на пользу
              Вообще-то пошло, но у тебя там жуткая мешанина.

              >@include - это стандарт вообще-то.
              Я знаю что такое greasemonkey и его метаданные, неужели до сих пор не понял из контекста? И, внезапно, знаю, что такое greasemonkey режим для user-js в Опере. А ты?

              >Это особенность юзерскриптов. Покажи юзерскрипт, которые бы не ломался.
              Было бы логично использовать эту недоделку из кэша.

              И самое главное, большими буквами: говнокод - не место для релиза, даже если релиз - унылое говно. В pastebin брось, если хочешь чтоб помогали допилить...
              Ответить
              • >Вообще-то пошло, но у тебя там жуткая мешанина.

                Т.е. по твоему
                prevlink.appendChild(document.createTextNode('⟵'));

                лучше, чем
                prevlink.append('⟵');

                да?

                >Я знаю что такое greasemonkey и его метаданные
                ну так фигли ты глупые вопросы задаёшь?

                >Было бы логично использовать эту недоделку из кэша.
                Нераспарсил, переформулируй плиз.

                >В pastebin брось, если хочешь чтоб помогали допилить...
                там никто не увидит.
                Ответить
                • ну что тебе жалко чтоли написать подлиннее? лень мне натягивать сапоги и спускаться в выгребную яму, но думаю что, не ошибусь если скажу, что в 2 раза медленнее

                  >ну так фигли ты глупые вопросы задаёшь?
                  а зачем это: $(document).ready(
                  http://www.opera.com/docs/userjs/examples/#greasemonkey

                  >Нераспарсил, переформулируй плиз.
                  опять регэкспом парсишь? ;-) не знаю как это выразить на говножкуери, а принцип такой: var script=document.createElement("SCRIPT"); script.type="text/javascript"; script.src="http://example.com/~legoleg/govnokod.js"; и убеждаешься что с того конца где корова не мычит работают Last-Modified и If-Modified-Since. Вуаля, актуальная версия в кэше.
                  Ответить
    • 1) Код не читаемый совершенно: Может быть стоит изучить структурный подход?
      2) Что за хардкод цветов? Про разделение логики и представления не в кусре?

      Я понимаю, что JS --- язык ублюдошный, и писать на нем крайне тяжело, но зачем до такого дерьма-то опускаться?
      Ответить
      • >Может быть стоит изучить структурный подход?
        Не вижу профита в такой крошечной программе. Стоило бы до конца перейти на jQuery, но лень. Принимаются патчи.
        >Что за хардкод цветов?
        А чё, мне в рееестр может настройки сохранять?
        >Я понимаю, что JS --- язык ублюдошный
        Вовсе нет. Динамическая типизация, конечно, сосет, но JS тут один из самых приятных.
        >зачем до такого дерьма-то опускаться?
        Затем что хочется удобств при чтении коментов.
        Ответить
        • >>А чё, мне в рееестр может настройки сохранять?
          про внешний XML например мы не слышали)
          или хотя бы JSON с настройками
          Ответить
          • >про внешний XML например мы не слышали)
            Переносимый способ прочитать локальный xml-файл в студию!

            >или хотя бы JSON с настройками
            Какими настройками? Тут всего одна.
            Ответить
    • Ого!
      Это типа подсветка для гвестов? Круто! :)
      Ответить
      • Она самая. Забирай, если не лень прикручивать. Заодно исправишь опечатку в ".enrty-comments-count" ;)
        За таймстамп в титлах у дат коментов отдельный респект.
        В принципе, bugmenot прав, это не место для релизов, можно снести.
        Ответить
        • а я не оценил, в title, в исошном формате, да еще к локальному времени сервера приводится. лучше бросай последнюю версию сюда http://everfall.com/paste/ чтоб хайвмайнд подключился к работе

          ЗЫ: http://i.imgur.com/BRbfU.png
          Ответить
    • Мопед не мой…
      Ответить
    • Автор молодец. =)))
      Ответить
    • Может я нуб последний, но не объясните, как это к ГК в Лисе прикрутить?
      Ответить

    Добавить комментарий