zive.cz - ethereal skin

přidává hromadu nastavení - např. široký režim nebo menší font

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name        zive.cz - ethereal skin
// @description:cs přidává hromadu nastavení - např. široký režim nebo menší font
// @namespace   monnef.tk
// @include     http://www.zive.cz/*
// @version     3
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant       GM_getValue
// @grant       GM_setValue
// @description přidává hromadu nastavení - např. široký režim nebo menší font
// ==/UserScript==

function argumentsToArray(args) {
  return Array.prototype.slice.call(args);
}

function log(msg) {
  var prefix = "[EtherealSkin] ";
  if (arguments.length == 1) {
    console.log(prefix + msg);
  } else {
    console.log.apply(console, [prefix].concat(argumentsToArray(arguments)));
  }
}

var debug = false;

function bug() {
  if (debug) {
    log.apply(null, ["<Debug> "].concat(argumentsToArray(arguments)));
  }
}

log("by monnef (http://monnef.tk)");
log("Installing...");

styles = {
  wide: {
    title: "Široká plocha stránky",
    css: "\
    .cs-cnt, .cs-cnt-cl-l { width: auto; float: none; }\
    .ar-detail { width: auto; }\
    .cs-cnt { display: flex; }\
    .cs-cnt > .clear { flex: 0; }\
    .cs-cnt > .cs-cnt-cl-l { flex: 1; }\
    "
  },
  smallFont: {
    title: "Malé písmo",
    css: "\
    .ar-detail .ar-content,\
    .ar-detail .ar-annotation,\
    .forum-row-wrapper .forum-text p\
    { font-size: 14px; }\
    .forum-row-wrapper { margin-bottom: 10px !important; }\
    body { font-size: 0.65em; }\
    "
  },
  bigFont: {
    title: "Velké písmo",
    css: "\
    .ar-detail .ar-content,\
    .ar-detail .ar-annotation,\
    .forum-row-wrapper .forum-text p\
    { font-size: 20px; }\
    .forum-row-wrapper { margin-bottom: 10px !important; }\
    body { font-size: 1em; }\
    #article-promo #article-promo-content { height: 256px; }\
    #article-promo-lister-links .box { transform: translateY(65px); }\
    "
  },
  smallLineHeight: {
    title: "Menší výška řádků",
    css: "\
    .ar-detail .ar-content { line-height: 18px; }\
    "
  },
  smallerGapAfterCaptions: {
    title: "Menší mezera za nadpisy",
    css: "\
    .ar-detail .ar-content h2,\
    .ar-detail .ar-content h3\
    { margin-bottom: 0 !important; }\
    "
  },
  smallerGapAfterParagaphs: {
    title: "Menší mezera za odstavci",
    css: "\
    .ar-detail .ar-content p\
    { margin-bottom: 5px !important; }\
    "
  },
  smallerGapAfterImages: {
    title: "Menší mezera pod obrázky",
    css: "\
    .ar-detail .ar-content h6\
    { margin-bottom: 5px !important; }\
    "
  },
  smallerGapAfterLinkToAnotherArticle: {
    title: "Menší mezera pod odkazy na jiné články",
    css: "\
    .ar-link-to-another { margin-bottom: 5px !important; }\
    "
  },
};

function addFontStyle(name, before){
  var keyName = "font" + name.split(" ")[0];
  before = before || "";
  styles[keyName] = {
    title: "Font " + name,
    disabledByDefault: true,
    css: before + "\
    .fs-os, body { font-family: '" + name + "'; }\
    "
  };
}
addFontStyle("Arial");
addFontStyle("Verdana");
addFontStyle("Tahoma");
addFontStyle("Calibri");
addFontStyle("Times New Roman");
addFontStyle("Cambria");
addFontStyle("Courier New");
addFontStyle("Lucida Console");
addFontStyle("Roboto","@import url(https://fonts.googleapis.com/css?family=Roboto&subset=latin,latin-ext);");
addFontStyle("Lora", "@import url(https://fonts.googleapis.com/css?family=Lora&subset=latin,latin-ext);");
addFontStyle("Oswald","@import url(https://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext);");
addFontStyle("Open Sans Condensed", "@import url(https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300&subset=latin,latin-ext);");
// TODO: more fonts

styles.removeAnotherArticles =  {
  title: "Odstranit upotávky na jiné články v textu",
  disabledByDefault: true,
  css: ".ar-link-to-another { display: none; }"
};
styles.removeSocialMenu = {
  title: "Odstranit sociální svinčík (menu)",
  css: "\
  span[data-ga='Navigace;Hlavička, Menu'],\
  .ar-detail .ar-society-networks .ar-society-link\
  { display: none; }"
};

bug("Styles: ", styles);

function getFreeId() {
  var id;
  do {
    id = "s" + Math.floor(Math.random() * 1000);
  } while ($("#" + id).length != 0);
  return id;
}

function addStyle(name, css) {
  var head = $("head");
  var elem = $("<style/>").attr("id", getFreeId()).html(css);
  head.append(elem);
  return elem;
}

var SETTINGS_KEY = "settings";

function getEmptySettings(){
  return {
    mods: {}
  };
}

function getSettings() {
  var raw = GM_getValue(SETTINGS_KEY);
  bug("raw settings", raw);
  if (!raw) {
    return getEmptySettings();
  } else {
    return JSON.parse(raw);
  }
}

function isModEnabled(name) {
  var mods = getSettings().mods;
  bug("got mods:", mods, "checking if enabled:", name);
  if (!name) {
    log("Warning! isModEnabled got name = " + name);
    return false;
  }
  if (!mods.hasOwnProperty(name)) {
    var defaultVal = (function() {
      if (styles[name].disabledByDefault) return false
      else return true;
    })();
    mods[name] = defaultVal;
    bug(name, "doesn't have value, inserting default", defaultVal);
  }
  return mods[name];
}

function setModState(name, state) {
  bug("setting mod state", name, state);
  var s = getSettings();
  s.mods[name] = state;
  setSettings(s);
}

function setSettings(settings) {
  GM_setValue(SETTINGS_KEY, JSON.stringify(settings));
  bug("saved settings", settings);
}

function applyEnabledMods() {
  for (key in styles) {
    var value = styles[key];
    bug(key);
    if (isModEnabled(key)) {
      bug("enabled");
      if (!value.elem) {
        bug("inserting");
        value.elem = addStyle(key, value.css);
      }
    } else {
      bug("disabled");
      if (value.elem) {
        bug("removing");
        value.elem.remove();
        value.elem = null;
      }
    }
    bug(key, value);
  }
}

function createDialog() {
  bug("creating dialog");
  var dialog = $("<div/>");

  dialog.css("position", "absolute").css("right", "4em").css("top", "1.2em");
  dialog.css("border", "1px solid #a8a").css("background-color", "#ece");
  dialog.css("padding", "0.5em").css("z-index", "1000").css("max-width", "350px");
  dialog.css("font-family", "calibri").css("font-size", "16px");
  dialog.hide();

  dialog.append($("<h1/>").text("Ethereal Skin by monnef").css("color", "black").css("margin", 0));
  dialog.append($("<div/>").text("Tuto porci modů Vám přinesl skript Ethereal Skin. Pokud chcete podpořit vývoj nebo jen vyjádřit svůj dík, můžete zaslat příspěvek.").css("text-align", "left")).css("margin", "1em");
  dialog.append($("<div/>").append($("<a>").attr("href", "https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=U6PGB7P24WWSU&lc=CZ&item_name=Ethereal%20Skin&item_number=ethereal_skin&currency_code=CZK&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted").attr("target", "_blank").append($("<img>").attr("src", "https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif"))).css("margin", "1em"));

  var options = $("<div/>").css("margin", "1em 0");

  for (key in styles) {
    var value = styles[key];
    e = $("<div>").css("text-align", "left").css("display", "flex").css("align-items", "center");
    id = getFreeId();
    e.append($("<input type='checkbox'/>").attr("id", id).data({
      styleId: key
    }));
    e.append($("<label>").attr("for", id).text(value.title));
    bug("created checkbox group", e);
    options.append(e);
  }

  dialog.append(options);


  var loadValuesFromConfig = function loadValuesFromConfig() {
    options.children().each(function() {
      var item = $(this);
      var checkBox = item.find("input");
      var modName = checkBox.data().styleId;
      bug("loading values from config for mod name = ", modName, "for item", item, "(", item[0], ")");
      checkBox.prop("checked", isModEnabled(modName));
    });
  };

  var dialogOkButton = $("<button>").text("Uložit").css("float", "right").css("font-weight", "bold");
  var dialogCancelButton = $("<button>").text("Zrušit").css("float", "left").css("opacity", "0.5");
  var dialogResetButton = $("<button>").text("Resetovat nastavení").css("color", "red").css("opacity", "0.5").css("float", "left").css("margin-left", "1em");

  dialogCancelButton.click(function() {
    dialog.hide();
  });
  dialogOkButton.click(function() {
    options.children().each(function() {
      var item = $(this);
      var checkBox = item.find("input");
      var modName = checkBox.data().styleId;
      var newState = checkBox.prop("checked");
      bug("saving values to config for mod name = ", modName,"to a new state = ", newState, "for item", item, "(", item[0], ")");
      setModState(modName, newState);
    });
    applyEnabledMods();
    dialog.hide();
  });
  dialogResetButton.click(function(){
    if(confirm("Opravdu zahodit všechna nastavení?")){
      setSettings(getEmptySettings());
      applyEnabledMods();
      loadValuesFromConfig();
    }
  });

  dialog.append($("<div/>").append(dialogCancelButton).append(dialogResetButton).append(dialogOkButton));

  var dialogData = {
    loadValuesFromConfig: loadValuesFromConfig
  };

  dialog.data(dialogData);

  return dialog;
}

function insertControls() {
  var dialog = createDialog();
  var mainButton = $("<button>").text("E");
  mainButton.css("position", "absolute").css("right", "1em").css("top", "1em");
  mainButton.css("background-color", "#cac").css("border", "1px solid #a8a");
  mainButton.css("width", "2em").css("height", "2em");
  mainButton.css("z-index", "1000").css("font-weight", "bold");
  mainButton.click(function() {
    dialog.toggle();
    if (dialog.is(":visible")) {
      dialog.data().loadValuesFromConfig();
    }
  });

  $("body").append(mainButton);
  $("body").append(dialog);
}

insertControls();
applyEnabledMods();

log("Done.");