# Парсер новостей * Убирает рекламу * Выделяет заголовок, картинку, текст статьи * Выставляет картинку размером 600 пикселей * Текст выравнивает по ширине * Указывает источник * Для ЗВ готовит новость для КроссПостинга
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
8.3 KiB

// ==UserScript==
// @name News parser
// @namespace http://zakonvremeni.ru
// @version 0.1
// @description Parse news
// @author AlexeiBv+mirocod@narod.ru
// @match https://tass.ru/*
// @match https://ria.ru/*
// @match https://zakonvremeni.ru/*
// @icon https://icons.duckduckgo.com/ip2/zakonvremeni.ru.ico
// @grant none
// ==/UserScript==
// Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
(function() {
'use strict';
function getByClass (className, parent) {
parent || (parent=document);
var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
var re = new RegExp("(?:^|\\s)" + className + "(?!\\S)");
while (e=descendants[++i]) {
if (re.test(e.className)){
result.push(e);
}
}
return result;
}
function GetImageInContainers(baseClass, parent, textAlign) {
var elems = getByClass(baseClass, parent);
if (!elems) {
return '';
}
var i;
var img_src = '';
var re = new RegExp("(https?:\/\/.*\.(?:png|jpg))");
for (i in elems) {
var e = elems[i];
var children = e.querySelectorAll("*");
for(let i = 0; i < children.length; i++){
var c = children[i];
if (c.nodeName == 'IMG' && re.test(c.src)) {
img_src = c.src;
}
}
}
if (img_src.length > 0) {
return '<p style = "text-align:' + textAlign + ';"><img src = "'+ img_src + '" width = "600px"/></p>';
}
return '';
}
function Trim(s) {
return ( s || '' ).replace( /^\s+|\s+$/g, '' );
}
function RemoveBeforeSplitter(a_String, a_Splitter) {
var index = a_String.indexOf(a_Splitter)
if (index != -1) {
return a_String.substring(index + a_Splitter.length);
}
return a_String;
}
function RemoveAfterSplitter(a_String, a_Splitter, a_SaveSplitter) {
var index = a_String.indexOf(a_Splitter)
if (index != -1) {
var spl_len = a_Splitter.length
if (!a_SaveSplitter) {
spl_len = 0;
}
return a_String.substring(0, index + spl_len);
}
return a_String;
}
function FinishWorkFuncTemplate(a_OutTag, a_TextAlign) {
function FinishWorkFunc(a_Content, a_Element) {
if (a_OutTag && a_TextAlign) {
return '<' + a_OutTag + ' style = "text-align:' + a_TextAlign + ';">' + a_Content + '</' + a_OutTag + '>';
}
else {
return a_Content;
}
}
return FinishWorkFunc
}
function GetContentInContainers(a_FinishWorkFunc, a_GrubTextFunc, baseClass, parent, a_ElementFilterFunc, a_ClearTextFunc) {
var elems = getByClass(baseClass, parent);
if (!elems) {
return 'Не удалось найти ' + baseClass;
}
var result = '';
for (var i in elems) {
var e = elems[i];
if (a_ElementFilterFunc && !a_ElementFilterFunc(e)) {
continue;
}
var content = '';
if (e.querySelectorAll) {
var children = e.querySelectorAll("*");
if (children.length == 0 || e.innerText) {
content += a_GrubTextFunc(e);
}
else {
for (let i = 0; i < children.length; i++) {
var c = children[i];
content += a_GrubTextFunc(c);
}
}
}
if (a_ClearTextFunc) {
content = a_ClearTextFunc(content);
}
if (a_FinishWorkFunc) {
result += a_FinishWorkFunc(content, e);
}
else {
result += content;
}
}
return result;
}
function ClearUrl(a_Url) {
var separator = '?';
return RemoveAfterSplitter(a_Url, separator, false);
}
function FIlterTrue(element) {
return true;
}
function FIlterRia(element) {
if (element.dataset.type == 'text' || element.dataset.type == 'quote' || element.dataset.type == 'list') {
return true;
}
return false;
}
function FIlterZV(element) {
if (element.itemprop == 'articleBody') {
return true;
}
return false;
}
function ClearTextFuncTemplate(a_RemoveBeforeList) {
function ClearTextFunc(a_Content) {
var content = a_Content;
for (let i = 0; i < a_RemoveBeforeList.length; i++) {
var r = a_RemoveBeforeList[i];
content = RemoveBeforeSplitter(content, r);
}
return content;
}
return ClearTextFunc
}
function GrubTextFuncTemplate() {
function GrubTextFunc(a_Element) {
var content = '';
if (a_Element.innerText) {
content = Trim(a_Element.textContent);
}
return content;
}
return GrubTextFunc
}
function MakeContent() {
var content = '';
var title_tag = 'h2';
var p_tag = 'p';
var zero_tag = '';
var source_add = true;
var title_func = FinishWorkFuncTemplate(title_tag, 'center')
var paragraph_func = FinishWorkFuncTemplate(p_tag, 'justify')
var zero_tag_func = FinishWorkFuncTemplate()
if (location.hostname == 'tass.ru') {
content += GetContentInContainers(title_func, GrubTextFuncTemplate(), 'tass_pkg_title--variant_h1_default.*', document.getElementById('content_box'));
content += GetImageInContainers('Image_wrapper_.*', document.getElementById('content_box'), 'center');
content += GetContentInContainers(paragraph_func, GrubTextFuncTemplate(), 'Paragraph_paragraph.*', document.getElementById('content_box'), FIlterTrue, ClearTextFuncTemplate(['/ТАСС/. ']));
}
else if (location.hostname == 'ria.ru') {
content += GetContentInContainers(title_func, GrubTextFuncTemplate(), title_tag, document.getElementsByClassName('article__header')[0]);
content += GetImageInContainers('photoview__open', document.getElementsByClassName('article__header')[0], 'center');
content += GetContentInContainers(paragraph_func, GrubTextFuncTemplate(), p_tag, 'article__block', document.getElementsByClassName('article__body')[0], 'justify', FIlterRia, ClearTextFuncTemplate(['– РИА Новости. ', '— РИА Новости. ']));
}
else if (location.hostname == 'zakonvremeni.ru') {
var title = GetContentInContainers(zero_tag_func, GrubTextFuncTemplate(), 'page-header', document.getElementsByClassName('item-page')[0]);
var parent_category = GetContentInContainers(zero_tag_func, GrubTextFuncTemplate(), 'parent-category-name', document.getElementsByClassName('item-page')[0]);
var category = GetContentInContainers(zero_tag_func, GrubTextFuncTemplate(), 'category-name', document.getElementsByClassName('item-page')[0]);
var page = RemoveAfterSplitter(Trim(document.getElementsByClassName('item-page')[0].querySelector('[itemprop=articleBody]').textContent), '.', true);
content = title + '\n' + parent_category + ' ' + category + '\n\n' + page + '\n' + document.URL;
source_add = false;
}
var result = '';
if (content.length > 0) {
result = '<textarea id = "news_content" rows="10" cols="100">' + content;
if (source_add) {
result += '<p style="text-align: justify;">Источник: <a href = "' + ClearUrl(document.URL) + '">' + location.hostname + '</a></p>';
}
result += '</textarea>';
}
return result;
}
var content = MakeContent();
var logo = document.createElement("div");
logo.innerHTML = '<div style="margin: 0pt auto; width: 800px; text-align: center;">' + content + '</div>';
document.body.insertBefore(logo, document.body.firstChild);
})();