巴哈姆特文章列表強化

強化哈拉版的文章列表

目前為 2018-04-14 提交的版本,檢視 最新版本

// ==UserScript==
// @name         巴哈姆特文章列表強化
// @namespace    https://blog.maple3142.net/
// @version      0.2
// @description  強化哈拉版的文章列表
// @author       maple3142
// @require      https://unpkg.com/[email protected]/dist/vue.runtime.min.js
// @require      https://unpkg.com/[email protected]/dist/vuejs-storage.min.js
// @match        https://forum.gamer.com.tw/B.php?*
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==
(function (Vue,vjss,$) {
'use strict';

function __$$styleInject(css, ref) {
  if ( ref === void 0 ) ref = {};
  var insertAt = ref.insertAt;

  if (!css || typeof document === 'undefined') { return; }

  var head = document.head || document.getElementsByTagName('head')[0];
  var style = document.createElement('style');
  style.type = 'text/css';

  if (insertAt === 'top') {
    if (head.firstChild) {
      head.insertBefore(style, head.firstChild);
    } else {
      head.appendChild(style);
    }
  } else {
    head.appendChild(style);
  }

  if (style.styleSheet) {
    style.styleSheet.cssText = css;
  } else {
    style.appendChild(document.createTextNode(css));
  }
}

Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue;
vjss = vjss && vjss.hasOwnProperty('default') ? vjss['default'] : vjss;
$ = $ && $.hasOwnProperty('default') ? $['default'] : $;

(function () {
	if (typeof document !== 'undefined') {
		var head = document.head || document.getElementsByTagName('head')[0],
		    style = document.createElement('style'),
		    css = " .btn-cb[data-v-5651d276]{ display: inline-block; border: 0; border-radius: 3px; padding: 3px 12px; height: 25px; background-color: #117e96; color: #FFF; font-size: 12px; margin-left: 5px; } .btn-cb.active[data-v-5651d276]{ background-color: #222e96; } ";style.type = 'text/css';if (style.styleSheet) {
			style.styleSheet.cssText = css;
		} else {
			style.appendChild(document.createTextNode(css));
		}head.appendChild(style);
	}
})();

var btnCb = { render: function () {
		var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('button', { staticClass: "btn-cb", class: { active: _vm.value }, on: { "click": function ($event) {
					$event.preventDefault();_vm.$emit('input', !_vm.value);
				} } }, [_vm._t("default")], 2);
	}, staticRenderFns: [], _scopeId: 'data-v-5651d276',
	props: ['value']
};

(function () {
	if (typeof document !== 'undefined') {
		var head = document.head || document.getElementsByTagName('head')[0],
		    style = document.createElement('style'),
		    css = "";style.type = 'text/css';if (style.styleSheet) {
			style.styleSheet.cssText = css;
		} else {
			style.appendChild(document.createTextNode(css));
		}head.appendChild(style);
	}
})();

var xf = { render: function () {
		var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('div', { staticClass: "ib" }, [_c('btn-cb', { model: { value: _vm.filter.hidelock, callback: function ($$v) {
					_vm.$set(_vm.filter, "hidelock", $$v);
				}, expression: "filter.hidelock" } }, [_vm._v("隱藏鎖文")]), _vm._v(" "), _c('btn-cb', { model: { value: _vm.filter.hidetop, callback: function ($$v) {
					_vm.$set(_vm.filter, "hidetop", $$v);
				}, expression: "filter.hidetop" } }, [_vm._v("隱藏置頂")]), _vm._v(" "), _c('btn-cb', { model: { value: _vm.filter.hideimg, callback: function ($$v) {
					_vm.$set(_vm.filter, "hideimg", $$v);
				}, expression: "filter.hideimg" } }, [_vm._v("隱藏有圖片的文章")])], 1);
	}, staticRenderFns: [],
	data: function data() {
		return {
			filter: {
				hidelock: false,
				hidetop: false,
				hideimg: false
			}
		};
	},
	storage: {
		namespace: 'x_filter',
		keys: ['filter'],
		storage: {
			setItem: GM_setValue,
			getItem: GM_getValue
		}
	},
	components: {
		btnCb: btnCb
	}
};

Vue.use(vjss);

var div = document.createElement('div');
var vm = new Vue({
	render: function (h) { return h(xf); },
	el: div
});
$('.b-list__filter').append($(div).addClass('ib').append(vm.$el));

var filter = vm.$children[0].filter;

var isLocked = function (el) { return $(el).find('.icon-lock').length > 0; };
var isTop = function (el) { return $(el).hasClass('b-list__row--sticky'); };
var isImg = function (el) { return $(el).find('.icon-photo').length > 0; };
function renderList() {
	$('.b-list>tbody>.b-list__row').each(function (i, el) {
		if (filter.hidelock && isLocked(el)) {
			$(el).hide();
		} else if (filter.hidetop && isTop(el)) {
			$(el).hide();
		} else if (filter.hideimg && isImg(el)) {
			$(el).hide();
		} else {
			$(el).show();
		}
	});
}
vm.$children[0].$watch('filter', { handler: renderList, deep: true });
renderList();

var obj;
var query = Object.assign.apply(Object, location.search.replace(/^\?/, '').split('&').map(function (x) { return x.split('='); }).map(function (x) { return (( obj = {}, obj[x[0]] = x[1], obj)); }));
var stringify = function (o) { return '?' + Object.keys(o).map(function (k) { return (k + "=" + (o[k])); }).join('&'); };

var firstpage = Math.max(query.page ? parseInt(query.page) : 1, 1);
var lastpage = firstpage;
var $firstrow = $('<tr>').addClass('b-list__row');
var $lastrow = $('<tr>').addClass('b-list__row');
$('.b-list>tbody').append($lastrow);
$('.b-list__head').after($firstrow);
var existsTable = {};
$('.b-list>tbody>.b-list__row').find('a[name]').map(function (i, e) { return $(e).attr('name'); }).each(function (i, x) { return existsTable[x] = true; });
function xLoadFac(next) {
	return $('<div>').addClass('load-more').text('載入更多').click(function (e) {
		if (!next && firstpage === 1) {
			alert('已到首頁');
			return;
		}
		if (next) { lastpage++; }else { firstpage--; }
		var q = location.pathname + stringify(Object.assign({}, query, { page: next ? lastpage : firstpage }));
		history.pushState(null, '', q);
		fetch(q).then(function (r) { return r.text(); }).then(function (h) {
			// POST LIST
			var x = $(h).find('.b-list>tbody>.b-list__row').filter(function (i, e) {
				var a = $(e).find('.b-list__summary__sort a[data-subbsn]:last');
				if (a.length) {
					a.text(subtitle(a.data('subbsn')));
				}
				var id = $(e).find('a[name]').attr('name');
				if (existsTable[id]) { return false; }else { return existsTable[id] = true; }
			});
			if (next) { $lastrow.before(x); }else { $firstrow.after(x); }
			renderList(); //rerender

			// PAGER
			var $oldpager = $('.b-pager');
			var $newpager = $(h).find('.b-pager');
			if (next) { $oldpager.eq(1).replaceWith($newpager.eq(1)); }else { $oldpager.eq(0).replaceWith($newpager.eq(0)); }
		});
	});
}
$('.b-list').before(xLoadFac(false)).after(xLoadFac(true));

var css = ".load-more {\n\ttext-align: center;\n\tpadding: 1rem;\n}\n.load-more:hover{\n\tcolor: blue;\n}\n.ib{\n\tdisplay: inline-block;\n}";
__$$styleInject(css);

}(Vue,vuejsStorage,jQuery));