').html(escapeHtml(wsMessage.text)));
// Author
$commentTemplate.find('.author a.user').attr('href', userLink).html(wsMessage.author);
// Avatar and link
$commentTemplate.find('.info a').attr('href', userLink).children('img.avatar').attr('src', userAvatar + '/24');
// Post and comment ID's link
$commentTemplate.find('.clearfix .post-id a').attr('href', commentLink).html('#' + wsMessage.post_id + '/' + wsMessage.comment_id)
// Adding answer label
.after((wsMessage.to_comment_id !== null) ? (' в ответ на /' + wsMessage.to_comment_id + '') : (''));
// Setting action labels and other attributes
$commentTemplate.find('.action-labels .reply-label').attr('for', 'reply-' + wsMessage.post_id + '_' + wsMessage.comment_id);
$commentTemplate.find('.action-labels .more-label').attr('for', 'action-' + wsMessage.post_id + '_' + wsMessage.comment_id);
$commentTemplate.find('.post-content input[name="action-radio"]').attr('id', 'action-' + wsMessage.post_id + '_' + wsMessage.comment_id);
// Bookmark link
$commentTemplate.find('.action-buttons a.bookmark').attr('href', postLink + '/b?comment_id=' + wsMessage.comment_id + '&csrf_token=' + csRfToken);
// Reply form
$commentTemplate.find('.post-content input.reply-radio').attr('id', 'reply-' + wsMessage.post_id + '_' + wsMessage.comment_id);
$commentTemplate.find('.post-content form.reply-form').attr('action', '/' + wsMessage.post_id);
$commentTemplate.find('.post-content form.reply-form textarea[name="text"]').html('@' + wsMessage.author + ', ');
$commentTemplate.find('.post-content form.reply-form input[name="comment_id"]').val(wsMessage.comment_id);
$commentTemplate.find('.post-content form.reply-form input[name="csrf_token"]').val(csRfToken);
///Filling template
// It's time to DOM
console.info('Inserting comment');
// If list mode or not addressed to other comment
if ((treeSwitch == '?tree=0') || (wsMessage.to_comment_id == null)) {
// List mode
$('.content-wrap #comments #post-reply').before($commentTemplate.hide().fadeIn(2000));
} else {
// Tree mode
// Search parent comment
$parentComment = $('.post[data-comment-id="' + wsMessage.to_comment_id + '"]');
if ($parentComment.length > 0) {
console.log('Parent comment: %O', $parentComment);
// Check for children
$parentCommentChildren = $parentComment.next('.comments');
// If child comment already exist
if ($parentCommentChildren.length > 0) {
console.log('Child comments found. Appending...');
$parentCommentChildren.append($commentTemplate.hide().fadeIn(2000));
} else {
console.log('No child comments found. Creating...');
$parentComment.after($('
').addClass('comments').append($commentTemplate.hide().fadeIn(2000)));
}
} else {
console.log('Parent comment not found');
// FIXME: Double code
$('.content-wrap #comments #post-reply').before($commentTemplate.hide().fadeIn(2000));
}
}
// Adding anchor
$commentTemplate.before($anchor);
// Fading out highlight if needed
if (options.option_ws_comments_color_fadeout.value == true) {
console.log('Fading out the highlight');
$commentTemplate.children('.pp-highlight').fadeOut(20000);
}
// Desktop notifications
if (options.option_ws_comments_notifications.value == true) {
console.log('Showing desktop notification');
chrome.extension.sendMessage({
type: 'showNotification',
notificationId: 'comment_' + wsMessage.post_id + '#' + wsMessage.comment_id,
avatarUrl: getProtocol() + userAvatar + '/80',
title: '@' + wsMessage.author + ' #' + wsMessage.post_id + '(/' + wsMessage.comment_id + ')',
text: wsMessage.text
});
}
console.groupEnd();
});
break;
// Posts
case 'post':
console.group('ws-post #%s', wsMessage.post_id);
console.debug(wsMessage);
console.groupEnd();
break;
// Recommendation
case 'ok':
console.group('ws-recommendation #%s/%s', wsMessage.post_id, wsMessage.comment_id);
console.debug(wsMessage);
console.groupEnd();
break;
default:
console.group('ws-other');
console.log(wsMessage);
console.groupEnd();
break;
}
}
}
} catch (e) {
console.log('WebSocket exception:')
console.log(e);
console.log(evt.data);
}
;
};
}
// Font size
if ((options.option_enlarge_font.value == true) && (options.option_enlarge_font_size.value !== undefined)) {
$('body').css('font-size', (options.option_enlarge_font_size.value / 100) + 'em');
}
// @ before username
if (options.option_at_before_username.value == true) {
chrome.extension.sendMessage({
type: 'injectCSSFile',
file: 'css/modules/at_before_username.css'
});
}
// Hightlight post with new comments
if (options.option_other_hightlight_post_comments.value == true) {
mark_unread_post();
}
// Show recommendation count and unique commentators count
if (options.option_other_show_recommendation_count.value == true) {
set_posts_count_label();
}
// `Space` key scroll handler
if (options.option_other_scroll_space_key.value == true){
set_space_key_skip_handler();
}
$('#point-plus-debug').fadeOut(1000);
});
});
function getProtocol() {
return ((location.protocol == 'http:') ? 'http:' : 'https:')
}
function escapeHtml(text) {
return text
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """)
.replace(/'/g, "'")
.replace(/\n/g, "
");
}
// Monts for Date.getMonth()
var months = [
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
];
// Копия опций
var current_options;
// Картинки с бурятников
var booru_picture_count = 0;
function load_all_booru_images() {
$('.post-content a').each(function(num, obj) {
if ($(obj).hasClass('booru_pic')) {
return;
}
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('^https?://danbooru\\.donmai\\.us/posts/([0-9]+)', 'i'))) {
var image = create_image('danbooru', n[1]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?gelbooru\\.com\\/index\\.php\\?page\\=post&s\\=view&id=([0-9]+)', 'i'))) {
var image = create_image('gelbooru', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?safebooru\\.org\\/index\\.php\\?page\\=post&s\\=view&id=([0-9]+)', 'i'))) {
var image = create_image('safebooru', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?([a-z0-9-]+\\.)?deviantart\\.com\\/art/[0-9a-z-]+?\\-([0-9]+)(\\?.+)?$', 'i'))) {
var image = create_image('deviantart', n[3]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?e621\\.net\\/post\\/show\\/([0-9]+)\\/', 'i'))) {
var image = create_image('e621', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://derpiboo\\.ru\\/([0-9]+)', 'i'))) {
var image = create_image('derpibooru', n[1]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://([0-9a-z-]+)\\.tumblr\\.com\\/post\\/([0-9]+)', 'i'))) {
var image = create_image('tumblr', n[2], {'username': n[1]});
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
/*
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?konachan\\.net\\/post\\/show\\/([0-9]+)\\/', 'i'))) {
var image = create_image('konachannet', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^https?\\://(www\\.)?konachan\\.com\\/post\\/show\\/([0-9]+)\\/', 'i'))) {
var image=create_image('konachancom', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
*/
} else if (n = href.match(new RegExp('^https?://(www\\.)?pixiv\\.net\\/member_illust\\.php\\?mode\\=medium\\&illust_id\\=([0-9]+)', 'i'))) {
var image = create_image('pixiv', n[2]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (n = href.match(new RegExp('^http\\:\\/\\/anime\\-pictures\\.net\\/pictures\\/view_post\\/([0-9]+)', 'i'))) {
var image = create_image('animepicturesnet', n[1]);
obj.parentElement.insertBefore(image, obj);
booru_picture_count++;
} else if (false) {
}
});
}
function create_image(domain, id, additional) {
var a = document.createElement('a');
a.href = 'https://api.kanaria.ru/point/get_booru_picture.php?domain=' + domain + '&id=' + id;
if (typeof(additional) != 'undefined') {
for (var index in additional) {
a.href += '&add_' + encodeURIComponent(index) + '=' + encodeURIComponent(additional[index]);
}
}
$(a).addClass('booru_pic').addClass('booru-' + domain + '-' + id).addClass('postimg').attr({
'id': 'booru_pic_' + booru_picture_count,
'title': domain + ' image #' + id,
'target': '_blank'
});
var image = document.createElement('img');
image.alt = a.title;
image.src = a.href;
a.appendChild(image);
return a;
}
// Помечаем непрочитанные посты более видимо чем каким-то баджем
// Эта часть написана @RainbowSpike
function mark_unread_post() {
var divs = $(".post"); // массив постов
for (var i = 0; i < divs.length; i++) { // обыск постов
var spans = $(divs[i]).find(".unread"); // поиск метки непрочитанных комментов
if (spans.length > 0) { // если в посте есть непрочитанные комменты...
$(divs[i]).css({//...залить пост зеленоватым и скруглить
'background-color': '#EEFFEE',
'border-radius': '10px'
});
}
}
}
// Webm
function parse_webm() {
$('.post-content a').each(function(num, obj) {
if ($(obj).hasClass('booru_pic')) {
return;
}
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('\\.webm(\\?.+)?$', 'i'))) {
var player = document.createElement('video');
// @todo Там может быть не vp8+vorbis
$(player).html('
').attr('controls', 'controls').css({
'display': 'block',
'max-width': '95%'
}).addClass('parsed-webm-link');
obj.parentElement.insertBefore(player, obj);
if (current_options.option_videos_parse_leave_links.value == false) {
$(obj).hide();
}
}
});
}
// Видео
function parse_all_videos() {
$('.post-content a').each(function(num, obj) {
if ($(obj).hasClass('booru_pic')) {
return;
}
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('\\.(webm|avi|mp4|mpg|mpeg)(\\?.+)?$', 'i'))) {
var player = document.createElement('video');
var mime = video_extension_to_mime(n[1]);
$(player).html('
').attr('controls', 'controls').css({
'display': 'block',
'max-width': '95%'
}).addClass('parsed-webm-link');
obj.parentElement.insertBefore(player, obj);
if (current_options.option_videos_parse_leave_links.value == false) {
$(obj).hide();
}
}
});
}
function video_extension_to_mime(extension) {
switch (extension) {
case 'webm':return 'video/webm; codecs="vp8, vorbis';
case 'avi' :return 'video/avi;';
case 'mp4' :return 'video/mp4;';
case 'mpg' :return 'video/mp4;';
case 'mpeg':return 'video/mp4;';
}
}
// Аудио
function parse_all_audios(){
$('.post-content a').each(function(num, obj) {
if ($(obj).hasClass('booru_pic')) {
return;
}
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('^https?:\\/\\/([a-z0-9.-]+)\\/[a-z0-9_\\/.%-]+\\.(mp3|ogg|wav)(\\?.+)?$', 'i'))) {
var domain = n[1];
// Проверяем откуда мы грузимся
if (domain.match(new RegExp('\\.vk\\.me$', 'i'))){
// Так то ж Контакт!
if (typeof(n[3])=='undefined'){
return;
}
if (!n[3].match('extra\\=', 'i')){
return;
}
}
var player = document.createElement('audio');
var mime = audio_extension_to_mime(n[2]);
$(player).html('
').attr('controls', 'controls').css({
'display': 'block',
'max-width': '350px'
}).addClass('parsed-audio-link');
obj.parentElement.insertBefore(player, obj);
if (current_options.option_audios_parse_leave_links.value == false) {
$(obj).hide();
}
}
});
}
function audio_extension_to_mime(extension) {
switch (extension) {
case 'mp3': return 'audio/mpeg';
case 'ogg': return 'audio/ogg; codecs=vorbis';
case 'wav': return 'audio/vnd.wave';
}
}
// Плашки у постов
function set_posts_count_label() {
var ids = [];
$('.post .post-id a .cn').addClass('changed_background');
$('div.post').each(function(num, obj) {
var t = $(obj).attr('data-comment-id');
if (typeof(t) !== 'undefined') {
return;
}
var id = $(obj).attr('data-id');
ids.push(id);
});
$ajax({
'url': 'https://api.kanaria.ru/point/get_post_info.php?list=' + urlencode(ids.join(',')),
'success': function(a) {
var answer = JSON.parse(a);
$('div.post').each(function(num, obj) {
var id = $(obj).attr('data-id');
var postid = $(obj).find('.post-id a')[0];
var t = $(obj).attr('data-comment-id');
if (typeof(t) !== 'undefined') {
return;
}
var e1 = document.createElement('span');
if (typeof(answer.list[id]) == 'undefined') {
return;
}
$(e1).addClass('authors_unique_count').text(answer.list[id].count_comment_unique).attr('title', 'Количество комментаторов');
postid.appendChild(e1);
var e2 = document.createElement('span');
$(e2).addClass('recommendation_count').text('~' + answer.list[id].count_recommendation).attr('title', 'Количество рекомендаций. Работает криво, спасибо @arts\'у за это');
postid.appendChild(e2);
});
}
})
}
function parse_pleercom_links() {
if (current_options.option_embedding_pleercom_nokita_server.value) {
parse_pleercom_links_nokita();
} else {
parse_pleercom_links_ajax();
}
}
function parse_pleercom_links_nokita() {
$('.post-content a').each(function(num, obj) {
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('^https?:\\/\\/pleer\\.com\\/tracks\\/([0-9a-z]+)', 'i'))) {
var player = document.createElement('audio');
$(player).attr({
'src': 'https://api.kanaria.ru/point/get_pleer_file.php?id=' + n[1],
'controls': 'controls',
'preload': 'none'
});
var player_div = document.createElement('div');
$(player_div).addClass('embeded_audio').addClass('embeded_audio_' + n[1]);
player_div.appendChild(player);
obj.parentElement.insertBefore(player_div, obj);
}
});
}
function parse_pleercom_links_ajax() {
$('.post-content a').each(function(num, obj) {
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('^https?:\\/\\/pleer\\.com\\/tracks\\/([0-9a-z]+)', 'i'))) {
var player_div = document.createElement('div');
$(player_div).addClass('embeded_audio').addClass('embeded_audio_' + n[1]);
$(obj).addClass('pleercom_original_link_'+n[1]);
obj.parentElement.insertBefore(player_div, obj);
create_pleercom_ajax(n[1]);
}
});
}
function create_pleercom_ajax(id) {
$ajax({
'url': 'https://pleer.com/site_api/files/get_url',
'type': 'post',
'postdata': 'action=download&id=' + id,
'dont_set_content_type': true,
'pleer_id': id,
'headers': [['Accept', '*'], ['Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8']],
'success': function(a) {
var answer = JSON.parse(a);
var player = document.createElement('audio');
// @todo Проверять существование track_link
$(player).attr({
'src': answer.track_link,
'controls': 'controls',
'preload': 'auto'
});
$('.embeded_audio_' + this.settings.pleer_id)[0].appendChild(player);
if (current_options.option_embedding_pleercom_orig_link.value == false){
$('.pleercom_original_link_'+this.settings.pleer_id).hide();
}
},
'error': function() {
console.log('Can not get pleer.com url');
setTimeout(new Function('create_pleercom_ajax("' + this.settings.pleer_id + '");'), 1000);
}
});
}
// Проставляем теги у постов
function create_tag_system() {
$('.post').each(function() {
var tags = $(this).find('div.tags a.tag');
for (var i = 0; i < tags.length; i++) {
var tag_name = $(tags[i]).html().toLowerCase();
$(this).addClass('post-tag-' + tag_name);
}
});
}
// Скролл по пробелу
function set_space_key_skip_handler() {
if ($('#comments').length > 0) {
return;
}
// @todo Свериться с Best-practice биндинга функций. Мб там on или bind
$(document.body).keydown(function(e) {
// @todo Я хотел по отпусканию кнопки, но там уже скролл срабатывает
// проверяем фокус
if ($(':focus').length > 0) {
return;
}
var k = event.keyCode;
if (k == 32){
space_key_event();
return false;
}
});
}
// Проставляем теги у постов
function create_tag_system() {
$('.post').each(function() {
var tags = $(this).find('div.tags a.tag');
for (var i = 0; i < tags.length; i++) {
var tag_name = $(tags[i]).html().toLowerCase();
$(this).addClass('post-tag-' + tag_name);
}
});
}
// Скролл по пробелу
function set_space_key_skip_handler() {
if ($('#comments').length > 0) {
return;
}
// @todo Свериться с Best-practice биндинга функций. Мб там on или bind
$(document.body).keydown(function(e) {
// @todo Я хотел по отпусканию кнопки, но там уже скролл срабатывает
// проверяем фокус
if ($(':focus').length > 0) {
return;
}
var k = event.keyCode;
if (k == 32) {
space_key_event();
return false;
}
});
}
function space_key_event() {
var scroll_current = $('body').scrollTop();
var scroll_step_size = 0;
var scroll_real = Math.max(scroll_current - scroll_step_size, 0);
var posts = $('.post');
for (var i = 0; i < posts.length; i++) {
var this_top_px = $(posts[i]).offset().top;
if (this_top_px > scroll_real) {
$('body').animate({
'scrollTop': this_top_px
}, 200);
return;
}
}
}
/* Автосохранение черновиков */
var draft_last_text = '';// Последний зафиксированный текст
function draft_restore() {
chrome.storage.sync.get('point_draft_text', function(items) {
$('#new-post-form #text-input').val(items.point_draft_text);
draft_last_text=items.point_draft_text;
});
}
function draft_set_save_handler() {
setInterval(draft_save_check, 5000);
$('#new-post-wrap .footnote').html($('#new-post-wrap .footnote').html() + '
');
}
var draft_save_busy = false;
function draft_save_check() {
if (draft_save_busy) {
return;
}
draft_save_busy = true;
// Видишь поиск id внутри id?.. ненавидишь меня?
var current_text = $('#new-post-form #text-input').val();
if (draft_last_text == current_text) {
draft_save_busy = false;
return;
}
// @todo i18n
$('.draft_save_status').text('Сохраняем черновик...').show();
// Сохраняем
draft_last_text=current_text;
// Save it using the Chrome extension storage API.
chrome.storage.sync.set({'point_draft_text': draft_last_text}, function() {
// Notify that we saved.
draft_save_busy=false;
$('.draft_save_status').text('Черновик сохранён...');
setTimeout(function(){
$('.draft_save_status').fadeOut(500);
}, 1000);
});
}
// Парсим ссылки на coub
function parse_coub_links() {
$('.post-content a').each(function(num, obj) {
var href = obj.href;
var n = null;
if (n = href.match(new RegExp('^https?:\\/\\/coub\\.com\\/view\\/([0-9a-z]+)', 'i'))) {
var player = document.createElement('iframe');
var parent_width = $(obj.parentElement).width();
$(player).attr({
'src': 'https://coub.com/embed/' + n[1] + '?muted=false&autostart=false&originalSize=false&hideTopBar=false&startWithHD=true',
'allowfullscreen': 'true'
}).css({
'max-width': '640px',
'border': 'none',
'width': Math.floor(parent_width * 0.9),
'height': Math.ceil(parent_width * 0.9 * 480 / 640)
}).addClass('embeded_video').addClass('embeded_video_' + n[1]);
obj.parentElement.insertBefore(player, obj);
if (current_options.option_embedding_coubcom_orig_link.value == false) {
$(obj).hide();
}
}
});
}