ЙажаСценарий / Говнокод #3404 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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         legolegs@yandex.ru
// @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 legolegs, (Updated )

Комментарии (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 прав, это не место для релизов, можно снести.
      Ответить
  • Может я нуб последний, но не объясните, как это к ГК в Лисе прикрутить?
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8