-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent-script.js
More file actions
165 lines (148 loc) · 14.5 KB
/
content-script.js
File metadata and controls
165 lines (148 loc) · 14.5 KB
1
2
3
4
5
6
7
8
9
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// Создание в памяти понятного заголовка для будушего файла
var pageHref = document.location.href;
var pageTitle = 'Выполнен экспорт новостей РИА Новости по ссылке: ' + pageHref;
console.log('Создан заголовок для файла дайджеста: ' + '"' + pageTitle + '"');
// Создание в памяти стандартного хедера для файла с закладками и папки для новостей
var bookmarkMeta = "<!DOCTYPE NETSCAPE-Bookmark-file-1>" +
"<!-- This is an automatically generated file." +
" It will be read and overwritten." +
" DO NOT EDIT! -->" +
"<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=UTF-8'>" +
"<TITLE>Дайджест новостей</TITLE>" +
"<H1>Дайджест новостей</H1>" +
"" +
"<DL><p>" +
' <DT><H3 ADD_DATE="0" LAST_MODIFIED="0">' + pageTitle + '</H3>' + // Создание в памяти папки с закладками для браузера с заданным ранее названием
' <DL><p>';
// Создание массива, куда запишутся все полученные новости
var vseNovosti = [];
// Создание в памяти кнопки удаления новости из дайджеста
var deleteIconLink = browser.runtime.getURL("/images/delete_icon.png"); // Получить из папки расширения ссылку на иконку удаления новостей, чтобы вставить её в кнопку
var deleteButton = document.createElement('a');
deleteButton.setAttribute('href', '#');
deleteButton.setAttribute('class', 'deleteButton');
deleteButton.setAttribute('style', 'display: inline-block; margin-top: 1%; font-size: 12px;');
deleteButton.setAttribute('onclick', 'event.preventDefault()');
deleteButton.innerHTML = '<img src="' + deleteIconLink + '"' + 'style="width: 25px; height: 25px;">' + '<span style="position: relative; top: 12%; padding-left: 5px;"> Удалить из дайджеста<s/span>';
// Объявление функции вставки кнопки удаления новостей
function deleteButtonInsert() {
var EnemiesInject = document.querySelectorAll('.list-item__title'); // Выделение всех новостей на странице
// Объявление функции удаления новостей кликом по кнопке
function deleter() {
var deleterNotification = this.previousSibling.innerHTML;
console.log('Удаление новости ' + '"' + deleterNotification + '".');
this.closest('.list-item').remove();
};
// Начало цикла перебора новостей для вставки в каждую кнопки удаления из дайджеста
for (var enemyInject of EnemiesInject) {
enemyInject.setAttribute('onclick', 'event.preventDefault()');
var deleteButtonCopy = deleteButton.cloneNode(true); // Клонирование кнопки удаления, т.к. один узел не может быть в 20+ местах одновременно
enemyInject.after(deleteButtonCopy); // Вставка кнопки удаления новостей
// Вставка функции удаления в каждую копию кнопки удаления новостей
deleteButtonCopy.addEventListener('click', deleter);
};
};
// Запуск функции вставки кнопки удаления новостей
deleteButtonInsert();
// Объявление функции стирания кнопок удаления новостей (нужно для работы подгрузки новостей)
function deleteButtonDestroyer() {
var deleteButtonsSelector = document.querySelectorAll('.deleteButton'); // Выделение всех кнопок удаления новостей на странице
// Цикл стирания всех существующих кнопок удаления
for (var dB of deleteButtonsSelector) {
dB.remove();
};
};
// Объявление функции парсинга (перебора всех новостей на странице)
function startParsing() {
var News = document.querySelectorAll('.list-item__title'); // Выделение всех новостей на странице
// Начало цикла перебора новостей
for (var newsletter of News) {
var zag = newsletter.innerHTML;
var ssyl = newsletter.getAttribute('href');
var newsDay = ssyl.slice(21,23); // Получение из ссылки дня выхода новости
var newsMonth = ssyl.slice(19,21); // Получение из ссылки месяца выхода новости
var newsYear = ssyl.slice(15,19); // Получение из ссылки года выхода новости
var newsDate = newsDay + "." + newsMonth + "." + newsYear; // Получение даты выхода новости в правильном формате
var zakladka = ' <DT><A HREF="' + ssyl + '"' + ' ADD_DATE="0" LAST_MODIFIED="0">' + zag + ' - РИА Новости, ' + newsDate + '</A>'; // Формирование кода закладки
vseNovosti.push(zakladka); // Запись всех полученных новостей в массив
console.log('Выполнено сохранение новости: ' + zag + '(ссылка на новость: ' + ssyl + ').');
console.log('Создана закладка со следующим кодом: ' + zakladka);
};
};
// Объявление функции формирования страницы дайджеста взамен оригинальной (т.е. стирание исходной страницы -> запись результата на новую страницу)
function newPage() {
vseNovosti.length = 0; // Очистка массива новостей на всякий случай
startParsing(); // Старт функции парсинга (перебора всех новостей на странице)
document.doctype.remove(); // Удаляет DOCTYPE
document.head.remove(); // Удаляет тег <head>
document.body.remove(); // Удаляет тег <body>
document.getElementsByTagName("html")[0].innerHTML = ""; // Удаляет оставшийся код насколько это возможно*/
document.body.insertAdjacentHTML('beforebegin', bookmarkMeta);
document.body.insertAdjacentHTML('afterbegin', vseNovosti);
};
// Объявление функции прокрутки страницы вниз для получения дополнительных новостей
function scrollDown() {
var moreNewsButton = document.querySelector(".list-more");
moreNewsButton.scrollIntoView(top);
setTimeout('document.querySelector(".list-more").click()', 1000); // Автоматическое нажатие на первую кнопку подгрузки на странице (дальше она нажимается сама)
deleteButtonDestroyer(); // Удаление кнопок удаления (если/где они были вставлены), чтобы вставить их заново с учётом дополнительных новостей
setTimeout(deleteButtonInsert, 2000); // Повторный запуск (с намеренной задержкой) вставки кнопок удаления, чтобы охватить и нижние новости
console.clear(); // Очистка уведомлений консоли о прошлом парсинге новостей, т.к. его результаты стираются
console.log('Пользователь выбрал добавление дополнительных новостей.');
vseNovosti.length = 0; // Очистка массива новостей при нажатии на скролл, т.к. нужно заново записать массив с учётом дополнительных новостей
startParsing(); // Повторный запуск парсинга, чтобы включить в очищенный массив верхние и нижние новости
};
// Объявление функции обновления интерфейса для вставки кнопок удаления заново
function interfaceUpdate() {
deleteButtonDestroyer(); // Удаление кнопок удаления (если/где они были вставлены), чтобы вставить их заново с учётом дополнительных новостей
deleteButtonInsert(); // Повторный запуск (с намеренной задержкой) вставки кнопок удаления, чтобы охватить и нижние новости
};
// Объявление функции остановки прокрутки страницы вниз (для этого удаляется дефолтная кнопка подгрузки)
function stopScroll() {
document.querySelector('.list-more').remove();
stopScrollButton.setAttribute('style', 'border-radius: 0px 0px 39px 39px; height: 35px; text-align: center; color: #ffffff; background-color: #000000; margin-top: 2px;');
stopScrollButton.innerHTML = '<span style="display: inline-block; padding-top: 5px;">Подгрузка новостей остановлена<span>';
scrollButton.remove();
console.log('Подгрузка новостей остановлена.');
};
// Создание в памяти кнопки для добавления дайджеста в архивах новостей по датам
var iconlink = browser.runtime.getURL("/images/bookmark_icon.png"); // Получить ссылку на иконку закладки из папки
var bookm = document.createElement('div');
bookm.setAttribute("style", "border-radius: 39px 39px 0px 0px; height: 35px; text-align: center; color: #ffffff; background-color: #010f40; cursor: pointer;");
bookm.innerHTML = '<span style="display: inline-block; padding-top: 5px;"><img src="' + iconlink + '"' + 'style="width: 25px; height: 25px;' + '">' + 'Создать дайджест</span>';
bookm.addEventListener("click", newPage);
// Создание в памяти кнопки прокрутки страницы вниз для получения дополнительных новостей
var scrollButton = document.createElement('div');
scrollButton.setAttribute('style', 'height: 35px; text-align: center; color: #ffffff; background-color: #ff331c; cursor: pointer; margin-top: 2px;');
scrollButton.innerHTML = '<span style="display: inline-block; padding-top: 5px;">↓ Добавить ещё новости ↓<span>';
scrollButton.addEventListener('click', scrollDown);
// Создание в памяти кнопки обновления интерфейса для вставки кнопок удаления заново
var interfaceUpdaterButton = document.createElement('div');
interfaceUpdaterButton.setAttribute('style', 'height: 35px; text-align: center; color: #ffffff; background-color: #010f40; cursor: pointer; margin-top: 2px;');
interfaceUpdaterButton.innerHTML = '<span style="display: inline-block; padding-top: 5px;">Обновление интерфейса<span>';
interfaceUpdaterButton.addEventListener('click', interfaceUpdate);
// Создание в памяти кнопки остановки получения дополнительных новостей
var stopScrollButton = document.createElement('div');
stopScrollButton.setAttribute('style', 'border-radius: 0px 0px 39px 39px; height: 35px; text-align: center; color: #ffffff; background-color: #ff331c; cursor: pointer; margin-top: 2px;');
stopScrollButton.innerHTML = '<span style="display: inline-block; padding-top: 5px;">Остановить подгрузку новостей<span>';
stopScrollButton.addEventListener('click', stopScroll);
// Создание в памяти контейнера для позиционирования всех кнопок
var buttonContainer = document.createElement('div');
buttonContainer.setAttribute('style', 'width: 300px; text-align: center; position: fixed; top: 25%; right: 24%; z-index: 1000; font-family: NotoSans, Arial, sans-serif; font-size: 16px;');
buttonContainer.setAttribute('class', 'buttonContainer');
// Выбор правильной кнопки в зависимости от типа ссылки (архив по дате или тег)
if (pageHref.indexOf('https://ria.ru/202') !== -1) {
var vstavka = document.querySelector(".rubric-title"); // Выбирается основной заголовок на странице архива
vstavka.after(buttonContainer); // Вставка после заголовка страницы контейнера для позиционирования обеих кнопок
var containerAppear = document.querySelector(".buttonContainer"); // Выбирается контейнер кнопок, чтобы вставить в него обе кнопки
containerAppear.prepend(bookm); // Вставка кнопки создания дайджеста
containerAppear.append(scrollButton); // Вставка кнопки пролистывания страницы и добавления новостей
containerAppear.append(interfaceUpdaterButton); // Вставка кнопки обновления интерфейса для вставки кнопок удаления заново
containerAppear.append(stopScrollButton); // Вставка кнопки остановки получения дополнительных новостей
} else {
var vstavka2 = document.querySelector(".tag-input__tags"); // Выбирается основной заголовок на странице тега
vstavka2.after(buttonContainer); // Вставка после заголовка страницы контейнера для позиционирования обеих кнопок
var containerAppear = document.querySelector(".buttonContainer"); // Выбирается контейнер кнопок, чтобы вставить в него обе кнопки
containerAppear.prepend(bookm); // Вставка кнопки создания дайджеста
containerAppear.append(scrollButton); // Вставка кнопки пролистывания страницы и добавления новостей
}