- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 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. Тестировал только в опере.
bugmenot 06.06.2010 15:55 # +1
2)
// @include http://govnokod.ru/*
document.location.href.match(/govnokod\.ru\/(\d+)/)
3) ".enrty-comments-count"
legolegs 06.06.2010 16:08 # 0
2) благодаря "@include" скрипт не выполняется для остальных сайтов. Оптимизация, однако
3) все претензии к страйкеру.
bugmenot 06.06.2010 18:00 # +1
ну начинается, "я только подобрал, размял и прилепил"
(я принял обет молчать о качестве кода использующего jQuery, чтобы не вызывать сотни баттхёрта)
2) а) матчишь location.href дважды, б) первый раз теряешь www. в) второй раз используешь замшелый IE3-specific document.location г) location.pathname же
3) вот щас придет страйкер и легким движением руки поломает все копии твоего скрипта, если они вообще работали (прямо здесь match() возвращает null)
legolegs 06.06.2010 20:15 # 0
А ежели код, скажем, на си, то вы тоже придираетесь к содержимому stdio.h?
>я принял обет молчать о качестве кода использующего jQuery
Часть кода не использует jQuery, не думаю, что это пошло на пользу этой части.
>матчишь location.href дважды
Второй раз в основном с целью получить номер говнокода. А @include - это стандарт вообще-то.
>первый раз теряешь www
"www" не нужно.
>location.pathname там всёравно слеш выкусывать и вычищать фидбурнеровский мусор.
>вот щас придет страйкер и легким движением руки поломает все копии твоего скрипта
Это особенность юзерскриптов. Покажи юзерскрипт, которые бы не ломался.
bugmenot 06.06.2010 23:42 # 0
Да хоть на C++, лишь бы случайным говном из интернетов не оказался. Назвался автором - нагибайся %)
>Часть кода не использует jQuery, не думаю, что это пошло на пользу
Вообще-то пошло, но у тебя там жуткая мешанина.
>@include - это стандарт вообще-то.
Я знаю что такое greasemonkey и его метаданные, неужели до сих пор не понял из контекста? И, внезапно, знаю, что такое greasemonkey режим для user-js в Опере. А ты?
>Это особенность юзерскриптов. Покажи юзерскрипт, которые бы не ломался.
Было бы логично использовать эту недоделку из кэша.
И самое главное, большими буквами: говнокод - не место для релиза, даже если релиз - унылое говно. В pastebin брось, если хочешь чтоб помогали допилить...
legolegs 07.06.2010 01:54 # 0
Т.е. по твоему
лучше, чем
да?
>Я знаю что такое greasemonkey и его метаданные
ну так фигли ты глупые вопросы задаёшь?
>Было бы логично использовать эту недоделку из кэша.
Нераспарсил, переформулируй плиз.
>В pastebin брось, если хочешь чтоб помогали допилить...
там никто не увидит.
bugmenot 08.06.2010 03:37 # 0
>ну так фигли ты глупые вопросы задаёшь?
а зачем это: $(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. Вуаля, актуальная версия в кэше.
guest 06.06.2010 16:45 # 0
2) Что за хардкод цветов? Про разделение логики и представления не в кусре?
Я понимаю, что JS --- язык ублюдошный, и писать на нем крайне тяжело, но зачем до такого дерьма-то опускаться?
legolegs 06.06.2010 20:21 # 0
Не вижу профита в такой крошечной программе. Стоило бы до конца перейти на jQuery, но лень. Принимаются патчи.
>Что за хардкод цветов?
А чё, мне в рееестр может настройки сохранять?
>Я понимаю, что JS --- язык ублюдошный
Вовсе нет. Динамическая типизация, конечно, сосет, но JS тут один из самых приятных.
>зачем до такого дерьма-то опускаться?
Затем что хочется удобств при чтении коментов.
guest 08.06.2010 01:06 # 0
про внешний XML например мы не слышали)
или хотя бы JSON с настройками
legolegs 08.06.2010 01:52 # 0
Переносимый способ прочитать локальный xml-файл в студию!
>или хотя бы JSON с настройками
Какими настройками? Тут всего одна.
striker 07.06.2010 00:25 # 0
Это типа подсветка для гвестов? Круто! :)
legolegs 07.06.2010 01:49 # 0
За таймстамп в титлах у дат коментов отдельный респект.
В принципе, bugmenot прав, это не место для релизов, можно снести.
bugmenot 08.06.2010 22:47 # 0
ЗЫ: http://i.imgur.com/BRbfU.png
mrbig66 07.06.2010 08:57 # −2
Александр Михалицын 17.06.2010 07:50 # 0
Govnocoder#0xFF 14.04.2011 14:11 # 0