zive.cz - oznaceni clanku s kapitolami

Označení článků s kapitolami (hlavní stránka a "nepřehlédněte")

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        zive.cz - oznaceni clanku s kapitolami
// @author      moen
// @namespace   monnef.tk
// @description Označení článků s kapitolami (hlavní stránka a "nepřehlédněte")
// @include     http://www.zive.cz/*
// @version     5
// @grant       none
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==

// nastavení
var chapFormat = "[Kapitoly - ~chap~] "; // formát přidávaného textu, použijte "~chap~" pro vložení počtu kapitol
// konec nastavení

var chapterString = "~chap~";
var parseChapterCount = new RegExp(chapterString).test(chapFormat);
var debug = false;
console.log("Označovač kapitol spuštěn (pChC=" + parseChapterCount + ")");

function stackTrace() {
  var err = new Error();
  return err.stack;
}

function hasChapters(data) {
  return data.indexOf("data-tracker=\"Navigace,NextChapter\"") > -1;
}

function markLink(link, chapCount) {
  var markText = chapFormat.replace(chapterString, chapCount);
  link.attr("title", 'Skript "Označení článků s kapitolami" vám vytvořil moen\n' + link.attr("title"));
  link.html(markText + link.html());
  afterChapterProcessed();
}

var chapterListWithUnorderedListRegex = /<div class="ar-chapters">[\s\S]*?(<ul>[\s\S]*?<\/ul>)[\s\S]*?<div class="ar-content">/;
var chapterListWithSelectRegex = /<div class="[^"]*ar-chapters[^"]*">[\s\S]*?(<select class="fs-os">[\s\S]*?<\/select>)[\s\S]*?<div class="ar-content">/;

// Gets string containing "<ul>" tag with chapters.
function getChapterListWithUnorderedList(data) {
  var list = data.match(chapterListWithUnorderedListRegex);
  if (list) return list[0];
  else return null;
}

function getChapterCountFromUnorderedList(data) {
  if (!parseChapterCount) return -1;
  var list = getChapterListWithUnorderedList(data);
  if (list) {
    return list.match(/<li>/g).length;
  } else {
    return 0;
  }
}

// Gets string containing "<select>" tag with chapters.
function getChapterListWithSelect(data) {
  var list = data.match(chapterListWithSelectRegex);
  if (list) return list[0];
  else return null;
}

function getChapterCountFromSelect(data) {
  if (!parseChapterCount) return -1;
  var list = getChapterListWithSelect(data);
  if (list) {
    return list.match(/<option /g).length;
  } else {
    return 0;
  }
}

function getChapterCount(data){
  return getChapterCountFromUnorderedList(data);
}

function onGenericArticleData(link, data, articleType) {
  if (debug) console.log("got response for [" + articleType + "]: " + link.html());
  if (hasChapters(data)) {
    if (debug) console.log("marking [" + articleType + "]: " + link.html());
    if (debug) console.log(stackTrace());
    markLink(link, getChapterCount(data));
  }
}

// Ordinary articles from main page

function onArticleData(link, data) {
  if (debug) console.log("got response for: " + link.html());
  if (hasChapters(data)) {
    if (debug) console.log("marking: " + link.html());
    markLink(link, getChapterCount(data));
  }
}

function askForArticle(link, onData, articleType) {
  var linkTarget = link.prop('href');
  if (linkTarget.indexOf("zive.cz") > -1) {
    if (debug) console.log("sending request: " + link.html() + " >>> " + linkTarget);
    if (debug) link.css("border", "solid 1px red");
    $.ajax({
      url: linkTarget
    }).done(function (data) {
      if (data) {
        onData(link, data, articleType);
      } else {
        console.log("got null data :(", link.text(), link[0]);
      }
    });
  } else {
    if (debug) console.log("skipping non-zive.cz link - " + linkTarget);
  }
}

$(".box-data > .arlist").each(function () {
  if (debug) $(this).css("border", "solid 2px green");
  var link = $(".smaller > a, h2 > a", this);
  askForArticle(link, onGenericArticleData, "main");
});


// Articles from "Don't miss"

function onDontMissData(link, data) {
  if (debug) console.log("got response for [don't miss]: " + link.html());
  if (hasChapters(data)) {
    if (debug) console.log("marking [don't miss]: " + link.html());
    markLink(link, getChapterCount(data));
  }
}

$("#article-promo-content div[id^=article-promo-content-detail]").each(function () {
  if (debug) $(this).css("border", "solid 2px orange");
  var link = $(".promo-text h1 a", this);
  if (debug) link.css("border", "solid 1px red");
  askForArticle(link, onGenericArticleData, "don't miss");
});


// "Similar articles" bellow current acrticle
$("#ctl04_maindata .box-tabbed .bx-data .arlist").each(function () {
  if (debug) $(this).css("border", "solid 2px gold");
  var link = $("h2 a", this);
  if (debug) link.css("border", "solid 1px magenta");
  askForArticle(link, onGenericArticleData, "similar");
});

// "Created by" notice
var createdCreatedByNotice = false;

function createCreatedByNotice() {
  var sigId = "chapMarkerSig";
  var sigElem = $("<div id='" + sigId + "'>Skript pro označení článků s kapitolami vám napsal <a href='http://monnef.tk'>moen</a>.</div>");

  var mainPageDiv = $("#ctl04_maindata .box-tabbed-gray div.box-data").last();
  var mainPageOlderDiv = $("#ctl04_secdata .box-tabbed-gray div.box-data").last();
  var similarArticlesDiv = $("#ctl04_maindata .box-tabbed .bx-data").last();
  var candidates = [mainPageDiv, mainPageOlderDiv, similarArticlesDiv];
  var nonEmpty = function (a) {
    return a.size() != 0;
  };
  var nonEmptyCandidates = candidates.filter(nonEmpty);
  if (nonEmptyCandidates.length > 0) {
    nonEmptyCandidates[0].append(sigElem);
  }

  $("#" + sigId).css("text-align", "right").css("font-size", "120%").css("margin-bottom", "5px");
}

function afterChapterProcessed() {
  if (!createdCreatedByNotice) {
    createdCreatedByNotice = true;
    createCreatedByNotice();
  }
}