// ==UserScript== // @name ShowInitMessOnForum // @namespace https://github.com/MyRequiem/comfortablePlayingInGW // @description В ответе на сообщение показывает то сообщение, на которое отвечают. // @id comfortablePlayingInGW@MyRequiem // @updateURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/separatedScripts/ShowInitMessOnForum/showInitMessOnForum.meta.js // @downloadURL https://raw.githubusercontent.com/MyRequiem/comfortablePlayingInGW/master/separatedScripts/ShowInitMessOnForum/showInitMessOnForum.user.js // @include https://*gwars*/messages.php* // @grant none // @license MIT // @version 2.27-140522 // @author MyRequiem [https://www.gwars.io/info.php?id=2095458] // ==/UserScript== /*global unsafeWindow */ /*jslint browser: true, maxlen: 80, vars: true, plusplus: true, nomen: true, regexp: true */ /*eslint-env browser */ /*eslint no-useless-escape: 'warn', linebreak-style: ['error', 'unix'], quotes: ['error', 'single'], semi: ['error', 'always'], eqeqeq: 'error', curly: 'error' */ /*jscs:disable requireMultipleVarDecl, requireVarDeclFirst */ /*jscs:disable disallowKeywords, disallowDanglingUnderscores */ /*jscs:disable validateIndentation */ (function () { 'use strict'; /** * @class General * @constructor */ var General = function () { /** * @property root * @type {Object} */ this.root = this.getRoot(); /** * @property doc * @type {Object} */ this.doc = this.root.document; /** * @property loc * @type {String} */ this.loc = this.root.location.href; }; /** * @lends General.prototype */ General.prototype = { /** * @method getRoot * @return {Object} */ getRoot: function () { var rt = typeof unsafeWindow; return rt !== 'undefined' ? unsafeWindow : window; } }; var general = new General(); /** * @class AjaxQuery * @constructor */ var AjaxQuery = function () { /** * @method init * @param {String} url * @param {Function} onsuccess * @param {Function} onfailure */ this.init = function (url, onsuccess, onfailure) { var xmlHttpRequest = new XMLHttpRequest(); if (!xmlHttpRequest) { general.root.console.log('Error create xmlHttpRequest !!!'); return; } xmlHttpRequest.open('GET', url, true); xmlHttpRequest.send(null); var timeout = general.root.setTimeout(function () { xmlHttpRequest.abort(); }, 10000); xmlHttpRequest.onreadystatechange = function () { if (xmlHttpRequest.readyState === 4) { clearTimeout(timeout); if (xmlHttpRequest.status === 200) { onsuccess(xmlHttpRequest); } else { onfailure(); } } }; }; }; /** * @class ShowInitMessOnForum * @constructor */ var ShowInitMessOnForum = function () { /** * @property pageNum * @type {int} */ this.pageNum = 0; /** * @property messages * @type {Array|null} */ this.messages = null; /** * @method getMessagesOnPages * @param {Object} obj * @return {NodeList} */ this.getMessagesOnPages = function (obj) { return obj.querySelectorAll('td>table[cellpadding="5"]' + '[cellspacing="0"][border="0"]'); }; /** * @method insertMess * @param {Element} target * @param {Element} last */ this.insertMess = function (target, last) { target = target.querySelector('tr'); target.firstElementChild. setAttribute('style', 'padding-left: 20px;'); // noinspection JSUnresolvedVariable var author = last.parentNode.previousElementSibling. querySelector('b').innerHTML, lastLink = last.previousElementSibling.querySelector('a').href, tr = last.querySelector('tr:last-child').cloneNode(true), divMess = tr.querySelector('td>div[style$="overflow:hidden;"]'), messComplete = divMess.innerHTML, // если длина сообщения более 400 символов или в сообщении // более 3 переносов строк ('
'), то выводим половину // сообщения если его длина менее 400 или только первые 200 // символов если его длина более 400 символов longMess = messComplete.length > 400 || divMess.querySelectorAll('br').length > 3, messHeader = author + '   [↑]
'; // noinspection JSUnresolvedFunction divMess.parentNode.setAttribute('style', 'border: 1px dashed ' + '#339933; background: #C2EDC1;'); // noinspection HtmlUnknownAttribute divMess.innerHTML = messHeader + (!longMess ? messComplete : (messComplete.length > 400 ? messComplete.substring(0, 200) : messComplete. substring(0, Math.round(messComplete.length / 2))). // убираем тэги
в конце сокращенного сообщения replace(/\s*(?\s*)*$/, ''). // убираем незавершенную ссылку replace(/]+(>(https?|ftp):\/\/.*)?$/, '') + ' ...[' + 'развернуть]'); target.parentNode.insertBefore(tr, target); if (longMess) { var openLink = divMess.querySelector('span[name="openMess"]'); if (openLink) { openLink.addEventListener('click', function () { divMess.innerHTML = messHeader + messComplete; }, false); } } }; /** * @method parseMessages * @param {int} ind */ this.parseMessages = function (ind) { if (!this.messages[ind]) { return; } var messDiv = this.messages[ind].querySelector('div'); if (!messDiv) { ind++; this.parseMessages(ind); return; } var reg = /^\s*\+?\s*(\d+)(,\D+|\.\D+|\)|\s|:|\+\D+)/, numReply = reg.exec(messDiv.innerHTML); numReply = numReply ? +numReply[1] : 0; // нет номера/номер === 0 или число > текущего сообщения if (numReply < 1 || numReply >= this.pageNum * 20 + ind + 1) { ind++; this.parseMessages(ind); return; } // порядковый номер сообщения на странице, на которое отвечаем var sequenceNum = numReply < 21 ? numReply - 1 : numReply % 20 !== 0 ? numReply % 20 - 1 : 19, // страница, где находится сообщение, на которое отвечаем // (на каждой странице 20 сообщений) pageReply = Math.floor((numReply - 1) / 20); // если сообщение, на которое отвечаем, // находится на текущей странице if (pageReply === this.pageNum) { this.insertMess(this.messages[ind], this.messages[sequenceNum]); ind++; this.parseMessages(ind); } else { var url = general.loc.replace(/&page_id=\d+(#\d+)?#?/g, '') + '&page_id=' + pageReply, _this = this; new AjaxQuery().init(url, function (xml) { var spanContent = general.doc.createElement('span'); spanContent.innerHTML = xml.responseText; var mess = _this.getMessagesOnPages(spanContent); _this.insertMess(_this.messages[ind], mess[sequenceNum]); ind++; general.root.setTimeout(function () { _this.parseMessages(ind); }, 1000); }, function () { general.root.setTimeout(function () { _this.parseMessages(ind); }, 1000); }); } }; /** * @method init */ this.init = function () { if (/&page_id=\d+/.exec(general.loc)) { this.pageNum = +/&page_id=(\d+)/.exec(general.loc)[1]; } else if (/page_id=last/.test(general.loc)) { var num = general.doc.querySelector('td[style="cursor:' + 'pointer;"][class="greenlightbg"]'); if (num) { this.pageNum = +num.firstElementChild.innerHTML; } } this.messages = this.getMessagesOnPages(general.doc); this.parseMessages(0); }; }; new ShowInitMessOnForum().init(); }());