Guest User

Untitled

a guest
Apr 14th, 2023
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 6.16 KB | Source Code | 0 0
  1. // ==UserScript==
  2. // @name          Ficbook.net story export script
  3. // @namespace     ficbooknet
  4. // @author        Enobarbous
  5. // @description   Загружает все главы работы для просмотра на одной странице. Работает только на странице "Содержание". ВНИМАНИЕ! Настоятельно не рекомендуется использовать скрипт на работах больше 1000 фикбук-страниц!
  6. // @version       1.2
  7. // @include       https://ficbook.net/readfic/*
  8. // @exclude       https://ficbook.net/readfic/*/*
  9. // @grant         none
  10. // @noframes
  11. // ==/UserScript==
  12.  
  13. //Проверка на oneshot
  14. if (document.querySelector('article.article a.part-link') ) {
  15.   console.log('Run ficbook.net story export script');
  16.   addStyle();
  17.   addButton();
  18.   addOverlay();
  19. } else {
  20.   console.log('Oneshot')
  21. };
  22.  
  23.  
  24. function addStyle() {
  25.   var style = document.createElement('style');
  26.       style.type = 'text/css';
  27.       style.innerHTML =
  28.         '#as_button' +
  29.         '{cursor:pointer;float:right;margin:0px 20px;padding:0px 20px;text-align:center;' +
  30.         'font-size:20px;font-weight:400;font-variant:small-caps;color:#542A00;' +
  31.         'background-color:#FAF4EA;border:1px solid #542A00;border-radius:2px;transition-duration:0.3s;} ' +
  32.         '#as_button:hover' +
  33.         '{color:#76482e;background-color:#e8d8bb;} ' +
  34.         '#as_overlay' +
  35.         '{display:none} ' +
  36.         '#as_layer' +
  37.         '{position:fixed;top:0;left:0;height:100%;width:100%;z-index:10000;background-color:#000000;opacity:0.6;} ' +
  38.         '#as_popup' +
  39.         '{position:fixed;width:350px;height:75px;top:0;right:0;bottom:0;left:0;margin:auto;z-index:20000;' +
  40.         'text-align:center;line-height:70px;font-size:18px;color:#542A00;' +
  41.         'border:1px solid #542A00;border-radius:3px;background-color:#FAF4EA;} ' +
  42.         '.as-chapter' +
  43.         '{margin: 0 1.5%;text-align:justify;} ' +
  44.         '.as-chapter-link' +
  45.         '{display:block!important;text-align:right;margin-bottom:4%;margin-top:-1%;margin-right:1.5%;} ' +
  46.         '.as-chapter-link:visited' +
  47.         '{color:#a09d98!important;} ' +
  48.         '#accordion, .adult-warning, .start-reading, .rkl-desktop-in-text, .rkl-block, .fb-ads-block' +
  49.         '{display:none!important;}';
  50.   document.head.appendChild(style);
  51.   console.log('Style');
  52. };
  53.  
  54.  
  55. function addButton() {
  56.   var node = document.createElement('div');
  57.   var button = document.createElement('span');
  58.       button.setAttribute('id', 'as_button');
  59.       button.setAttribute('title', 'Показать всю работу на этой странице');
  60.       button.appendChild(document.createTextNode('all story') );
  61.       button.onclick = runStoryExport;
  62.   node.appendChild(button);
  63.   //Для актуальных браузеров
  64.   var parent = document.querySelector('article.article');
  65.   parent.prepend(node);
  66.   //Для старых браузеров
  67.   /*var parent = document.querySelector('.start-reading');
  68.   document.querySelector('article.article').insertBefore(node, parent);*/
  69.   console.log('Button');
  70. };
  71.  
  72.  
  73. function addOverlay() {
  74.   var overlay = document.createElement('div');
  75.       overlay.setAttribute('id', 'as_overlay');
  76.   var bg_layer = document.createElement('div');
  77.       bg_layer.setAttribute('id', 'as_layer');
  78.   var popup = document.createElement('div');
  79.       popup.setAttribute('id', 'as_popup');
  80.       popup.appendChild(document.createTextNode('ИДЕТ ЗАГРУЗКА РАБОТЫ...') );
  81.   overlay.appendChild(bg_layer);
  82.   overlay.appendChild(popup);
  83.   document.body.appendChild(overlay);
  84.   console.log('Overlay');
  85. };
  86.  
  87.  
  88. function runStoryExport() {
  89.   setTimeout(showOverlay, 0);
  90.   setTimeout(exportChapter, 100);
  91.   setTimeout(hideOverlay, 200);
  92. };
  93.  
  94.  
  95. function showOverlay() {
  96.   document.querySelector('#as_overlay').style.display = 'block';
  97.   //console.log('Show overlay');
  98. };
  99.  
  100.  
  101. function hideOverlay() {
  102.   document.querySelector('#as_overlay').style.display = 'none';
  103.   //console.log('Hide overlay');
  104. };
  105.  
  106.  
  107. function getLinks() {
  108.   var parser = document.querySelectorAll('article.article a.part-link');
  109.   //console.log(parser);
  110.   var arr = Array.prototype.slice.call(parser);
  111.   var result = arr.map(function(item) { return item.href; } );
  112.   //console.log(result);
  113.   console.log('Links');
  114.   return result;
  115. };
  116.  
  117.  
  118. function exportChapter() {
  119.   var chapters = [];
  120.   var links = getLinks();
  121.   links.forEach(function(item) {
  122.     var url = item;
  123.     //console.log(url);
  124.     //При асинхронном вызове сервер фикбука примерно в 1 из 10 запросов возвращает страницу "Технические работы"
  125.     var xhr = new XMLHttpRequest();
  126.     xhr.open('get', url, false);
  127.     xhr.onload = function() {
  128.       //console.log(xhr.responseText);
  129.       var resp = document.createElement('div');
  130.           resp.innerHTML = xhr.responseText;
  131.       var chapter_text = resp.querySelector('article.article');
  132.       //console.log(chapter_text);
  133.       chapters.push(chapter_text);
  134.       console.log('Load ' + url);
  135.       var div = document.createElement('div');
  136.       var chapter_link = document.createElement('a');
  137.           chapter_link.setAttribute('href', url);
  138.           chapter_link.setAttribute('target', '_blank');
  139.           chapter_link.setAttribute('class', 'as-chapter-link');
  140.           chapter_link.setAttribute('onclick', 'window.open(this.href, this.target); return false');
  141.           chapter_link.appendChild(document.createTextNode('Открыть главу в новой вкладке') );
  142.       div.appendChild(chapter_link);
  143.       //console.log(div);
  144.       chapters.push(div);
  145.     };
  146.     xhr.send();
  147.   } );
  148.   //console.log(chapters);
  149.   var content = document.querySelector('article.article');
  150.   content.innerHTML = '';
  151.   chapters.forEach(function(item) {
  152.     var text = item;
  153.     var chapter = document.createElement('div');
  154.         chapter.setAttribute('class','as-chapter');
  155.         chapter.innerHTML = text.innerHTML;
  156.     //console.log(chapter);
  157.     content.appendChild(chapter);
  158.     } );
  159.   console.log('Story loaded');
  160. };
  161.  
Advertisement
Add Comment
Please, Sign In to add comment