fanex

ficbook snippet

Dec 24th, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [$('.operations')[0]].map(e=>{
  2.     let btn = (n,f)=>{
  3.         let b =  document.createElement('button');
  4.         b.onclick = f;
  5.         b.innerText = n;
  6.         e.parentNode.append(b);
  7.     }
  8.     btn('Подготовить', prepare);
  9.     btn('Добавить отсутствующие', main_send);
  10.     btn('Обновить', main_update);
  11.     let l = document.createElement('label');
  12.     let cb = document.createElement('input');cb.type='checkbox';cb.checked = true;
  13.     notPublishedCheckbox = cb;
  14.     l.append('   ',cb,' Черновик');
  15.     text = document.createElement('div');
  16.     text.contentEditable = true;
  17.     text.style.cssText  = 'background:white;border:1px dotted gray; width:49.5%; float:left;';
  18.     text2 = document.createElement('div');
  19.     text2.style.cssText = 'background:hsl(0,0%,95%);border:1px dotted gray; width:49.5%; float:right;';
  20.     e.parentNode.append(l,document.createElement('br'),text,text2);
  21. })
  22. info = (...a)=>(console.log(...a),toastr.info(...a));
  23. alert = (...a)=>(console.warn(...a),toastr.warning(...a));
  24. prepared = false;
  25.  
  26. function prepare(){
  27.     t = text.innerHTML;
  28.     if(!t.match(/<h1/)) return alert('В тексте нет заголовков!');
  29.     t2 = t.replace(/<(?!\/?(h1|br|p|b|s|i|center|right)[\s|>])[^>]*>/g,'');// remove bad tags
  30.     t3 = t2.replace(/<(\/?)(h1|br|b|s|i|center|right)(?=[\s|>])[^>]*>/g,'<$1$2>');// remove attributes
  31.     parts = t3.split(/<h1[^>]*>/)
  32.         .map(e=>e.split('</h1>'))
  33.         .slice(1)
  34.         .map(e=>({            
  35.             name:e[0],
  36.             text:tabber(e[1]),
  37.         }))
  38.     text2.innerHTML = [].concat(...parts.map(p=>['<br><br><h1>',p.name,'</h1><br>',p.text.replace(/\n/g,'<br>')])).join('\n');
  39.     prepared = true;
  40. }
  41.  
  42. async function main_send(){
  43.     if(text.innerHTML.length < 100) return alert('Вставьте в белое поле рядом с кнопкой "Добавить часть" скопированный из TinyMCE текст');
  44.     if(!prepared) return alert('Подготовьте текст!');
  45.     info('текст есть','глав: '+parts.length);    
  46.     console.log('prepared!');
  47.     await sendAll();
  48.     alert('Вроде всё...\nПоменяйте количество ждущих на 1~10');
  49. }
  50.  
  51. async function main_update(){
  52.     if(text.innerHTML.length < 100) return alert('Вставьте в белое поле рядом с кнопкой "Добавить часть" скопированный из TinyMCE текст');
  53.     if(!prepared) return alert('Подготовьте текст!');
  54.     info('текст есть','глав: '+parts.length);    
  55.     console.log('prepared!');
  56.     await updateAll();
  57.     alert('Вроде всё...');
  58. }
  59.  
  60.  
  61. async function updateAll(){
  62.     for (var i8743 = 0; i8743 < parts.length; i8743++){
  63.         await updateOne(parts[i8743]);
  64.     }
  65. }
  66.  
  67. async function updateOne(p) {
  68.     aa = $('.part>.title>a').toArray().map(a=>({t:a.innerText, ids:a.href.match(/\d+/g)}));
  69.     a0 = aa.find(a=>a.t==p.name);
  70.     if(!a0) return alert('части '+p.name+' нет');
  71.     fanfic_id = a0.ids[0]
  72.     part_id = a0.ids[1]
  73.     info('id: ' +fanfic_id+' / '+part_id);
  74.     ctt = p.text.replace(/<br>/, '\n');
  75.     info('длина текста: ' +ctt.length);
  76.     f = {
  77.         part_id,
  78.         fanfic_id,
  79.         title:p.name,
  80.         content:ctt,
  81.         comment_direction:"0",
  82.         comment:"",
  83.         change_description:"обновлено скриптом",
  84.         status:"1",
  85.         not_published:notPublishedCheckbox.checked?"1":"0",
  86.         auto_pub:"0",
  87.         auto_pub_day:"24",
  88.         auto_pub_month:"12",
  89.         auto_pub_year:"2017",
  90.         auto_pub_hour:"7",
  91.         auto_pub_minute:"0"
  92.     }
  93.     d = new FormData();
  94.     for (k in f) {d.append(k, f[k]);}
  95.     r = await fetch('https://ficbook.net/home/fanfics/partauthoredit_save',{
  96.         method:'POST',
  97.         credentials:'include',
  98.         body:d,
  99.     })
  100.     rt = await r.text();
  101.     info(rt);
  102.     toastr.info(p.name,'Часть отправлена')
  103.  
  104. }
  105.  
  106. async function sendAll(){
  107.     for (var i8743 = 0; i8743 < parts.length; i8743++){
  108.         await sendOne(parts[i8743]);
  109.     }
  110. }
  111.  
  112. async function sendOne(p) {
  113.     aa = $('.part>.title>a').toArray().map(a=>({t:a.innerText, ids:a.href.match(/\d+/g)}));
  114.     a0 = aa.find(a=>a.t==p.name);
  115.     if(a0) return alert('часть '+p.name+' уже есть');
  116.     hr = text.parentElement.querySelector('a').href;
  117.     fanfic_id = hr.match(/\d+/)[0];
  118.     r = await fetch(hr+'/addpart',{credentials:'include'});
  119.     rt = await r.text();
  120.     info('данные1: ' +rt.length);
  121.     insert_after = rt.match(/<option value="(\d+)" selected/)[1];
  122.     info('insert_after: ' +insert_after);
  123.     ctt = p.text.replace(/<br>/, '\n');
  124.     info('длина текста: ' +ctt.length);
  125.     f = {
  126.         fanfic_id,
  127.         title: p.name,
  128.         content: ctt,
  129.         insert_after,
  130.         status: 1,
  131.         not_published: notPublishedCheckbox.checked,
  132.         auto_pub:0,
  133.     }
  134.     d = new FormData();
  135.     for (k in f) {
  136.         d.append(k, f[k]);
  137.     }
  138.     r = await fetch('https://ficbook.net/home/fanfics/partadd_save',{
  139.         method:'POST',
  140.         credentials:'include',
  141.         body:d,
  142.     })
  143.     rt = await r.text();
  144.     info(rt);
  145.     toastr.info(p.name,'Часть отправлена')
  146. }
  147.  
  148. function tabber(s){
  149.     let hTexts = {};
  150.  
  151.     function hText(s) {
  152.         if (hTexts[s]) return hTexts[s];
  153.         let a = document.createElement('a');
  154.         a.innerHTML = s;
  155.         return hTexts[s] = a.innerText;
  156.     }
  157.     const nbsp = '\xa0'; //hText('&nbsp;');
  158.     const emsp = '\u2003'; //hText('&emsp;');
  159.     const ndash = '\u2013'; //hText('&ndash;');
  160.     const replacers = [
  161.         [/\n/g, ' '],
  162.         [/^\s+|\s+$/gm, '\n\n\n'],
  163.         [/&[^;]{2,7};/g, hText],
  164.         [/<br>|<.div><div[^>]*>|<.div>|<div[^>]*>/g, '\n'],
  165.         [/<p[^>]*(center|right)[^>]*>([^]*?)<\/p>/g, '\n<$1>\n$2\n</$1>\n'],
  166.         [/<\/p>\s*<p[^>]*>/g,'\n'],
  167.         [/<\/p>\s*|\s*<p[^>]*>/g,'\n'],
  168.         [/<script>[^]*?<.script>/, ''],
  169.         [/\s*\n{4,}/g, '\n\n\n'],
  170.         [/(\s*)(<(b|i|s)>)/g,'$2$1'],
  171.         [/(^|[^\.])(|\.{2,4}(?!\.))(?!\n\s)? /gm, '$1… '],
  172.         [/(||)/gm, ' - '],
  173.         [/--?(?![\-\wа-яёА-ЯЁ])|([^\-\wа-яёА-ЯЁ])-(?![\->\w])/g, `$1 - `],
  174.         [/^((?=.)\s)*/gm, emsp + emsp],
  175.         [/((?!\n)\s)+-\s+/gm, ' ' + ndash + nbsp],
  176.         [/^\s*/gm, emsp + nbsp + ndash],
  177.         [/\n<center>\n([^]*?)\n<\/center>\n/g, s => s.replace(/^\s*/gm, '')],
  178.         [/\n<right>\n([^]*?)\n<\/right>\n/g, s => s.replace(/^\s*/gm, '')],
  179.         [/\s*<center>\s*([*][\s*]*[*])\s*<\/center>\n*|\n+\s*([*][\s*]*[*])\s*\n+/g, '\n\n\n<center>\n$1$2\n</center>\n\n'],
  180.  
  181.         [/\n(<.?(center|right)>)\n/g, '$1'],
  182.         [/(<(b|i|s)>)(\s*)/g,'$3$1'],
  183.         [/<(?!\/?(b|i|s|center|right))/g, '&lt;'],
  184.         [/^\s*\n|\n\s*$/g, '']
  185.     ];
  186.     replacers.forEach(rpl => {
  187.         s0 = s;
  188.         s = s.replace(rpl[0], rpl[1]);
  189.         s = s;
  190.  
  191.     });
  192.     return s;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment