// ==UserScript==
// @name 「Feedly」Less Items
// @namespace https://www.wdssmq.com/
// @version 1.0.0
// @author 沉冰浮水
// @description Feedly 分次标记已读
// @license MIT
// @null ----------------------------
// @contributionURL https://github.com/wdssmq#%E4%BA%8C%E7%BB%B4%E7%A0%81
// @contributionAmount 5.93
// @null ----------------------------
// @link https://github.com/wdssmq/userscript
// @link https://afdian.net/@wdssmq
// @link https://greasyfork.org/zh-CN/users/6865-wdssmq
// @null ----------------------------
// @noframes
// @run-at document-end
// @match https://feedly.com/i/subscription/feed%2Fhttps%3A%2F%2F*
// @match https://feedly.com/i/my
// @match https://feedly.com/i/saved
// @grant none
// ==/UserScript==
/* jshint esversion: 6 */
/* eslint-disable */
(function () {
'use strict';
const gm_name = "LessItems";
const curDate = new Date();
// -------------------------------------
const _curUrl = () => { return window.location.href };
const _sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
// -------------------------------------
const _log = (...args) => console.log(`[${gm_name}]\n`, ...args);
// -------------------------------------
// const $ = window.$ || unsafeWindow.$;
function $n(e) {
return document.querySelector(e);
}
function $na(e) {
return document.querySelectorAll(e);
}
// -------------------------------------
// 添加内容到指定元素后面
function fnAfter($ne, e) {
const $e = typeof e === "string" ? $n(e) : e;
$e.parentNode.insertBefore($ne, $e.nextSibling);
}
const objDataSet = {
getDataSet(el, key, def) {
return el.dataset[key] || def;
},
setDataSet(el, key, val) {
el.dataset[key] = val;
},
};
const gob = {
intBlocks: 0,
maxBlocks: 4,
intUnread: 0,
minUnread: 37,
bolStopScroll: false,
curTimeMS: curDate.getTime(),
stopScroll(preCaB = () => { }) {
if (!gob.bolStopScroll) {
preCaB();
gob.bolStopScroll = true;
gob.setDataSet();
}
},
reset() {
gob.intBlocks = 0;
gob.bolStopScroll = false;
},
setDataSet() {
objDataSet.setDataSet($n("#header-title"), "stopScroll", "true");
},
getDataSet() {
return objDataSet.getDataSet($n("#header-title"), "stopScroll", "false");
},
};
function fnGetItems($baseEL = "body") {
let $items = $na(".list-entries article");
if ($baseEL !== "body") {
$items = $baseEL.querySelectorAll("article");
}
return $items;
}
async function fnAutoScroll($items, $blocks) {
const $h2End = $n(".list-entries > h2");
const $endItem = $items[$items.length - 1];
// // 阻止向下滚动
// if (gob.intAutoScroll > 4 && !$h2End) {
// $blocks[$blocks.length - 1].scrollIntoView();
// }
if (!gob.bolStopScroll && $h2End) {
$h2End.scrollIntoView();
}
if (gob.intBlocks > gob.maxBlocks || $h2End || !$endItem) {
gob.stopScroll(
() => {
_log("fnAutoScroll", "自动滚动停止");
_log("fnAutoScroll", gob);
},
);
return;
}
// dateset 不存在时,执行
if ($endItem.dataset.scrollIntoView !== "done") {
$endItem.scrollIntoView();
gob.intBlocks = $blocks.length;
$endItem.dataset.scrollIntoView = "done";
}
await _sleep(1000);
// // 隐藏最新的四个区块
// if (gob.intBlocks <= gob.maxBlocks && !$h2End) {
// [].forEach.call($blocks, ($e, i) => {
// // 隐藏
// // $e.remove();
// $e.style.display = "none";
// $e.classList.add("hidden");
// });
// }
fnLessItems();
}
// 构建侧边栏
function fnBuildSideBar($block) {
let $el = $n(".list.list-feed");
if (!$el) {
const $cols = $na(".row > div");
[].forEach.call($cols, ($e, i) => {
// 获取 $e 的类名
$e.className;
const text = $e.innerText;
if (text === "") {
$e.innerHTML = "<div><div class=\"list list-feed\"></div>";
$el = $n(".list.list-feed");
}
});
}
// 设置 fixed 定位
$el.parentNode.style.position = "fixed";
// 获取 $block 类名
const strClassBlock = $block.className.replace("EntryList__chunk", "").trim();
const strClassBtn = "btn-" + strClassBlock;
// _log(strClassBlock, `.${strClassBtn}`);
// _log("fnBuildSideBar", $n(`.${strClassBtn}`));
// 判断是否隐藏
const isHidden = $block.classList.contains("hidden");
if (!isHidden && !$n(`.${strClassBtn}`) && $na(".btn-LessItem").length < 4) {
// 追加元素 a
const $a = document.createElement("a");
$a.href = "javascript:void(0);";
$a.className = strClassBtn;
$a.classList.add("btn-LessItem");
$a.innerHTML = strClassBlock;
$a.style.display = "block";
// 边框和内边距
$a.style.border = "1px solid rgba(0,0,0,0.15)";
$a.style.padding = "3px 10px";
// 圆角和外边距
$a.style.borderRadius = "3px";
$a.style.margin = "3px 0";
// 点击事件
$a.addEventListener("click", function () {
$n("#feedlyPageFX").style.maxWidth = "1024px";
const $items = fnGetItems($block);
const intPer = Math.floor($items.length / 4);
const intClick = parseInt($block.dataset.click) || 0;
const curOffset = intClick * intPer;
// _log({
// intPer,
// intClick,
// curOffset,
// });
$items[curOffset].scrollIntoView();
// $items[curOffset].style.borderTop = "4px solid #444";
const $btnList = [];
let strAlert = "";
for (let i = 0; i < intPer; i++) {
const element = $items[i + curOffset];
if (!element) {
continue;
}
// 调整样式以减少页面占用
element.querySelector(".MagazineEntry").style.marginBottom = 0;
element.querySelector(".MagazineEntry").style.maxWidth = "720px";
// 获取标记已读按钮
const $btn = element.querySelector(
".EntryMarkAsReadButton",
);
$btnList.push($btn);
const $a = element.querySelector(".MagazineEntry__content > a");
strAlert += $a.textContent + "\n\n";
}
$block.dataset.click = intClick + 1;
setTimeout(() => {
// 确认对话框
// if (confirm(strAlert)) {
$btnList.forEach(($btn) => {
$btn.click();
});
if (curOffset + intPer >= $items.length) {
$a.style.display = "none";
return;
}
// }
}, 1000);
// alert(strAlert);
// _log("fnBuildSideBar", $items);
// _log("fnBuildSideBar", $btnList);
});
// 添加到 $el 后边
fnAfter($a, $el);
}
}
function fnLessItems() {
// 判断页面地址
if (_curUrl().indexOf("subscription/") === -1) {
return;
}
// 获取未读数
gob.intUnread = parseInt($n("span.MarkAsReadButton__unread-count").textContent);
// _log("fnLessItems", intUnread);
// 判断未读数
if (gob.intUnread < gob.minUnread) {
return;
}
if (gob.bolStopScroll) {
if (gob.getDataSet() == "false") {
gob.reset();
} else {
return;
}
}
const $items = fnGetItems();
const $blocks = $na(".list-entries .EntryList__chunk");
fnAutoScroll($items, $blocks);
[].forEach.call($blocks, function ($e, i) {
// 设置下边框
$e.style.borderBottom = "11px solid #444";
// 设置下边距
$e.style.marginBottom = "11px";
// 分配一个不重复的 class
$e.classList.add("LessItem" + i);
// $e.classList.add("LessItem");
fnBuildSideBar($e);
});
}
// 加载完成后执行
window.onload = function () {
fnOnLoad();
};
async function fnOnLoad() {
await _sleep(1000);
// 判断加载完成
if (!$n("#feedlyFrame")) {
fnOnLoad();
_log("fnOnLoad", "页面加载中");
return;
}
// 滚动条滚动时触发
if ($n("#feedlyFrame") && $n("#feedlyFrame").dataset.LessItem !== "done") {
$n("#feedlyFrame").dataset.LessItem = "done";
// $n("#feedlyFrame").addEventListener("mouseover", fnLessItems);
$n("#feedlyFrame").addEventListener("scroll", fnLessItems);
_log("fnOnLoad", "列表滚动监听");
}
}
})();