').append(replies).css({'max-height': '600px', 'overflow-y': 'auto'});
$(cardElt).after(container);
btn.text(' свернуть');
btn.click(e => hideAnswers(container, btn));
let nav = new Nav(forumElement, href, container);
container.prepend(nav.getElement());
}
function blobToText(blob){
// response.text() returns string in UTF-8
// but nnm club uses windows-1251 charset
// so here is a trick to get a string in that charset using a blob and File API
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onload = event => resolve(event.target.result);
reader.onabort = event => reject(event);
reader.onerror = event => reject(event);
reader.readAsText(blob, 'windows-1251');
});
}
function getRepliesCount(topicElt) {
let raw = $(topicElt).find('a.pcomm.tit-b.bold').text();
return parseInt(raw);
}
function hideAnswers(answers, btn) {
btn.unbind('click');
answers.hide();
btn.text(' развернуть');
btn.click(e => showAnswers(answers, btn));
}
function showAnswers(answers, btn) {
btn.unbind('click');
answers.show();
btn.text(' свернуть');
btn.click(e => hideAnswers(answers, btn));
}
class Nav {
constructor(documentElement, href, container){
this.elt = $('
');
// parse pages
let pageNav = $(documentElement).find('span.nav:contains(Страницы:)');
if(!pageNav) return;
// first element in set should contain page links
let anchors = $(pageNav[0]).find('a');
let pages = [href].concat(anchors.map((i, elt) => elt.href).get());
// remove link to "next" page
pages.pop();
if(pages.length < 2) return;
let html = pages.reduce((acc, curr, ind) => acc + `
${ind} `, 'Страницы: ');
this.elt.append(html).css({"font-weight": "bold", "padding": "10px", "padding-left": "0"});
anchors = this.elt.find('a');
anchors.first().addClass("nnm-show-replies__a-disabled");
anchors.click(e => $(e.target).addClass("nnm-show-replies__a-disabled"));
anchors.click(async e => {
e.preventDefault();
///TODO cache results somehow
let replies = await getReplies(e.target.href);
anchors.each((i,elt) => $(elt).removeClass("nnm-show-replies__a-disabled"))
if(!replies) return;
$(e.target).addClass("nnm-show-replies__a-disabled");
container.find('.forumline')
.before(replies)
.remove();
});
}
/** Returns a jquery object */
getElement(){
return this.elt;
}
}
async function getReplies(href) {
let pageText = await fetchPageText(href);
return !pageText ? null : parseRepliesAndGetElement(pageText);
}
async function fetchPageText(href) {
let response = await fetch(href);
if(!response.ok) {
error(`Cannot fetch page "${href}"`);
return null;
}
let blob = await response.blob();
let pageText = await blobToText(blob);
return pageText;
}
function parseRepliesAndGetElement(data){
let documentElement;
if(typeof data == 'string')
documentElement = new DOMParser().parseFromString(data, 'text/html');
else
documentElement = data;
const rem = 'td:nth-child(1) span.nav:contains(Вернуться к началу)';
let replies = $(documentElement).find('.forumline').eq(0);
let repliesPostElts = replies.find('tr').filter((i,elt) => $(elt).find(rem).length);
repliesPostElts.next().remove();
repliesPostElts.remove();
// remove first post
replies.find('tbody > tr.row1:nth-child(2)').remove();
// remove sorting form
replies.find('form > span.gensmall').remove();
replies.find('tr *:contains(Форма быстрого ответа)').remove();
replies.find('tr form[action^="posting.php"]').remove();
replies.find('#post_opt').remove();
return replies;
}
function addStyle(css){
let head = document.getElementsByTagName('head')[0];
if (head) {
let style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.textContent = css;
head.appendChild(style);
}
}
})();