zive.cz - oznaceni clanku s kapitolami

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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();
  }
}