Участник:Zimorodokan/add.js
Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
- Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
- Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
- Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
- Opera: Нажмите Ctrl+F5.
console.log('START')
let E = {};
let F = {};
F.preparePage = function preparePage () {
console.log('F.preparePage START')
if (location.pathname == '/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Zimorodokan/%D0%94%D0%9E%D0%91%D0%90%D0%92%D0%98%D0%A2%D0%AC') {
let html = document.createElement('html');
let head = document.createElement('head');
let body = document.createElement('body');
head.setAttribute('lang', 'ru');
head.setAttribute('dir', 'ltr');
html.appendChild(head);
html.appendChild(body);
console.log('BEFORELOAD', head);
document.replaceChild(html, document.documentElement);
document.head.insertAdjacentHTML('beforeend', `
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Добавить новость</title>
<meta name="Description" content="Страница добавления новости в проект ru.wikinews.org">
`);
document.head.insertAdjacentHTML('beforeend', `<style>
*,
*::before,
*::after {
background-clip: padding-box;
background-color: transparent;
background-image: none;
border: 0 solid transparent;
border-collapse: collapse;
border-image-width: 0;
box-sizing: border-box;
color: #000;
font-family: Verdana, Tahoma, Calibri, sans-serif;
font-size: unset;
margin: 0;
line-height: normal;
outline: 0 solid transparent;
overflow-wrap: break-word;
padding: 0;
text-transform: none;
word-wrap: break-word;
}
a {
color: rgb(0, 139, 19);
text-decoration: underline;
}
a:hover {
color: rgb(0, 63, 8);
}
button {
cursor: pointer;
}
.how-add-news-link {
font-size: 17px;
margin: 16px auto;
text-align: center;
}
#addNewsForm {
background-color: rgb(240, 255, 240);
border-color: rgb(15, 102, 7);
border-width: 2px;
margin: 16px auto;
padding: 0 16px;
box-shadow: 0 0 5px;
width: calc(100% - 6px);
border-radius: 10px;
}
#addNewsForm .form-input {
margin: 32px auto;
}
#addNewsForm .form-input label {
color: rgb(15, 102, 7);
cursor: pointer;
display: block;
font-weight: bold;
margin: 0 0 8px;
}
#addNewsForm .form-input input.block {
background-color: rgb(255, 255, 255);
border-color: rgb(224, 224, 224);
border-radius: 4px;
border-width: 2px;
display: block;
font-size: 16px;
line-height: 1.5;
padding: 4px 8px;
width: 100%;
}
#addNewsForm .form-input select.block {
background-color: rgb(255, 255, 255);
background-color: rgb(244, 244, 244);
border-color: rgb(224, 224, 224);
border-radius: 4px;
border-width: 2px;
display: block;
font-size: 16px;
max-height: 95vh;
width: 100%;
}
#addNewsForm .form-input input.block:invalid {
border-color: rgb(255, 0, 0);
box-shadow: none;
}
#addNewsForm .form-input input.block:focus {
border-color: rgb(13, 150, 0);
}
#addNewsForm .form-input select.block:invalid {
border-color: rgb(255, 0, 0);
box-shadow: none;
}
#addNewsForm .form-input select.block:focus {
border-color: rgb(13, 150, 0);
}
#addNewsForm .form-input select.block option {
background-color: #fff;
cursor: pointer;
display: block;
font-size: 16px;
line-height: 32px;
margin: 1px 0;
padding: 8px;
width: 100%;
}
#addNewsForm .form-textarea {
margin: 32px auto;
}
#addNewsForm .form-textarea label {
color: rgb(15, 102, 7);
cursor: pointer;
display: block;
font-weight: bold;
margin: 0 0 8px;
}
#addNewsForm .form-textarea textarea.block {
background-color: rgb(255, 255, 255);
border-color: rgb(224, 224, 224);
border-radius: 4px;
border-width: 2px;
display: block;
font-size: 16px;
height: 95vh;
min-height: 240px;
line-height: 1.5;
padding: 4px 8px;
min-width: 100%;
}
#addNewsForm .form-textarea textarea.block:focus {
border-color: rgb(13, 150, 0);
}
#addNewsForm .form-textarea textarea.block:invalid {
border-color: rgb(255, 0, 0);
box-shadow: none;
}
#addNewsForm .form-flat-buttons {
align-items: center;
border-color: rgb(244, 244, 244);
border-width: 1px 0 0 0;
bottom: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 32px auto 16px;
}
#addNewsForm .form-flat-buttons>button {
border-radius: 8px;
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .2);
cursor: pointer;
display: block;
flex: none;
font-size: 16px;
line-height: 48px;
margin: 0 8px 16px;
min-width: 64px;
padding: 0 24px;
overflow: hidden;
text-align: center;
white-space: nowrap;
}
#addNewsForm .form-flat-buttons>button:hover {
box-shadow: 0 5px 12px 0 rgba(0, 0, 0, .2);
}
.button.green {
background-color: rgb(14, 150, 0);
color: rgb(255, 255, 255);
}
.button.green:hover {
background-color: rgb(17, 202, 0);
color: rgb(255, 255, 255);
}
.button.blue {
background-color: rgb(0, 65, 161);
color: rgb(255, 255, 255);
}
.button.blue:hover {
background-color: rgb(0, 101, 252);
color: rgb(255, 255, 255);
}
.button.white {
background-color: rgb(255, 255, 255);
color: rgb(218, 36, 25);
}
.button.white:hover {
background-color: rgb(244, 244, 244);
}
@media (min-width: 640px) {
#addNewsForm .flex {
align-content: stretch;
display: flex;
justify-content: space-between;
margin: 32px auto;
}
#addNewsForm .flex>div {
flex: none;
margin: auto;
width: 40%;
}
}
</style>`);
document.body.insertAdjacentHTML('beforeend', `
<div class="how-add-news-link"><a href="https://ru.wikinews.org/?curid=1334" target="_blank">Как добавить новость</a></div>
<form id="addNewsForm" class="form">
<div class="form-input">
<label for="addNewsForm_Title">Заголовок новости</label>
<input class="block" type="text" name="addNewsForm_Title" id="addNewsForm_Title" required autocomplete="off"
placeholder="Введите Заголовок новости">
</div>
<div class="form-textarea">
<label for="addNewsForm_Text">Текст новости</label>
<textarea class="block" name="addNewsForm_Text" id="addNewsForm_Text" required autocomplete="off"
placeholder="Введите текст новости"></textarea>
</div>
<div class="form-input">
<label for="addNewsForm_Image">Изображение на Викискладе (<a href="https://commons.wikimedia.org/"
target="_blank">выбрать</a>)</label>
<input class="block" type="text" name="addNewsForm_Image" id="addNewsForm_Image" autocomplete="off"
placeholder="Изображение на Викискладе">
</div>
<div class="flex">
<div class="form-input">
<label for="addNewsForm_Topics">Главная тема</label>
<select class="block" name="addNewsForm_Topics" id="addNewsForm_Topics" size="20" required>
<option value="Происшествия">Происшествия</option>
<option value="Политика">Политика</option>
<option value="Наука и технологии">Наука и технологии</option>
<option value="Интернет">Интернет</option>
<option value="Общество">Общество</option>
<option value="Спорт">Спорт</option>
<option value="Экономика">Экономика</option>
<option value="Преступность и право">Преступность и право</option>
<option value="Культура">Культура</option>
<option value="Религия">Религия</option>
<option value="Фоторепортажи">Фоторепортажи</option>
<option value="Дни рождения ">Дни рождения </option>
<option value="Рейтинги">Рейтинги</option>
<option value="Некрологи">Некрологи</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
<option value="Спорт">Спорт</option>
</select>
</div>
<div class="form-input">
<label for="addNewsForm_Countries">Страна</label>
<select class="block" name="addNewsForm_Countries" id="addNewsForm_Countries" size="20" required>
<option value="Россия">Россия</option>
<option value="Украина">Украина</option>
<option value="США">США</option>
<option value="Франция">Франция</option>
<option value="Китай">Китай</option>
<option value="Великобритания">Великобритания</option>
<option value="Германия">Германия</option>
<option value="Евросоюз">Евросоюз</option>
<option value="Испания">Испания</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
<option value="США">США</option>
</select>
</div>
</div>
<div class="form-input">
<label for="addNewsForm_Categories">Категории новости</label>
<input class="block" type="text" name="addNewsForm_Categories" id="addNewsForm_Categories"
autocomplete="off" placeholder="Категории с разделителем «|»">
</div>
<div class="form-flat-buttons">
<button type="button" class="button type1 green" id="addNewsForm_SaveButton">Сохранить</button>
<button type="button" class="button type1 blue" id="addNewsForm_EditButton">Редактировать</button>
<button type="button" class="button type1 white" id="addNewsForm_CancelButton">Отменить</button>
</div>
</form>
</body>
`);
}
};
F.delayedStart = function delayedStart (func, timeout) {
console.log("F.delayedStart");
timeoutID = window.setTimeout(func, timeout);
};
F.findElements = function findElements() {
console.log("F.findElements");
E.addNewsForm = document.getElementById("addNewsForm");
E.addNewsForm_SaveButton = document.getElementById("addNewsForm_SaveButton");
console.log(E.addNewsForm);
};
F.formSubmit = async function formSubmit(event) {
event.preventDefault();
console.log("F.formSubmit");
let newsFormData = new FormData(E.addNewsForm);
let newsMainCountry = newsFormData.get('addNewsForm_Countries') ? newsFormData.get('addNewsForm_Countries') : '';
let newsMainTopic = newsFormData.get('addNewsForm_Topics') ? newsFormData.get('addNewsForm_Topics') : '';
let newsText = newsFormData.get('addNewsForm_Text');
let newsCategories = newsFormData.get('addNewsForm_Categories') ? newsFormData.get('addNewsForm_Categories') : '';
let newsImage = newsFormData.get('addNewsForm_Image');
let newsTitle = newsFormData.get('addNewsForm_Title');
let wikiNewsTitle = 'Участник:Zimorodokan%2F' + newsTitle;
let wikiNewsText = `
{{редактируется}}
{{дата|19 October 2020}}
{{тема|${newsMainCountry}|${newsMainTopic}}<!-- Внесите несколько (от 1 до 4) главных тем-категорий, разделяя символом «|» -->
[[Файл:${newsImage}|thumb|left|300px|]]<!-- Вставьте имя (после слова «Файл:») и описание (перед символами «]]») файла с Викисклада. -->
<!-- Напишите свой текст ниже этой строчки -->
${newsText}
<!-- Текст новости должен закончиться над этой строчкой -->
{{-}}
== Источники ==
* {{источник|url=|Название=|Автор=|Издатель=|Дата=}}
{{Подвал новости}}
<!-- Добавляйте категории разделяя символом «|» -->
{{Категории|${newsCategories}}}
`;
console.log(wikiNewsText);
let csrf_token = await F.getCsrfToken();
F.createNews(wikiNewsTitle, wikiNewsText, csrf_token);
};
F.createNews = async function createNews(wikiNewsTitle, wikiNewsText, csrf_token) {
console.log("F.createNews");
let newsPostData = new FormData();
newsPostData.append('text', wikiNewsText)
newsPostData.append('token', csrf_token)
let requestOptions = {
'method': 'POST',
'body': newsPostData
}
let response = await fetch(`https://ru.wikinews.org/w/api.php?action=edit&format=json&title=${wikiNewsTitle}`, requestOptions);
console.log(response);
};
F.addEvents = function addEvents() {
console.log("F.addEvents");
if (E.addNewsForm_SaveButton) {
E.addNewsForm_SaveButton.addEventListener("click", F.formSubmit);
};
};
F.getCsrfToken = async function getCsrfToken() {
console.log("F.getCsrfToken");
try {
var url = 'https://ru.wikinews.org/w/api.php?action=query&format=json&meta=tokens';
var response = await fetch(url);
var data = await response.json();
console.log(data);
return data.query.tokens.csrftoken;
} catch(err) {
console.log(err);
}
};
F.preparePage();
F.findElements();
F.addEvents();