// ==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));