163 lines
5.7 KiB
JavaScript
163 lines
5.7 KiB
JavaScript
/*
|
|
* decaffeinate suggestions:
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS205: Consider reworking code to avoid use of IIFEs
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
|
|
*/
|
|
var CatalogLinks = {
|
|
init() {
|
|
if ((g.SITE.software === 'yotsuba') && (Conf['External Catalog'] || Conf['JSON Index']) && !(Conf['JSON Index'] && (g.VIEW === 'index'))) {
|
|
const selector = (() => { switch (g.VIEW) {
|
|
case 'thread': case 'archive': return '.navLinks.desktop > a';
|
|
case 'catalog': return '.navLinks > :first-child > a';
|
|
case 'index': return '#ctrl-top > a, .cataloglink > a';
|
|
} })();
|
|
$.ready(function() {
|
|
for (var link of $$(selector)) {
|
|
var catalogURL;
|
|
switch (link.pathname.replace(/\/+/g, '/')) {
|
|
case `/${g.BOARD}/`:
|
|
if (Conf['JSON Index']) { link.textContent = 'Index'; }
|
|
link.href = CatalogLinks.index();
|
|
break;
|
|
case `/${g.BOARD}/catalog`:
|
|
link.href = CatalogLinks.catalog();
|
|
break;
|
|
}
|
|
if ((g.VIEW === 'catalog') && ((catalogURL = CatalogLinks.catalog()) !== g.SITE.urls.catalog?.(g.BOARD))) {
|
|
var catalogLink = link.parentNode.cloneNode(true);
|
|
var link2 = catalogLink.firstElementChild;
|
|
link2.href = catalogURL;
|
|
link2.textContent = link2.hostname === location.hostname ? '<%= meta.name %> Catalog' : 'External Catalog';
|
|
$.after(link.parentNode, [$.tn(' '), catalogLink]);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
if ((g.SITE.software === 'yotsuba') && Conf['JSON Index'] && Conf['Use <%= meta.name %> Catalog']) {
|
|
Callbacks.Post.push({
|
|
name: 'Catalog Link Rewrite',
|
|
cb: this.node
|
|
});
|
|
}
|
|
|
|
if (this.enabled = Conf['Catalog Links']) {
|
|
let el;
|
|
CatalogLinks.el = (el = UI.checkbox('Header catalog links', 'Catalog Links'));
|
|
el.id = 'toggleCatalog';
|
|
const input = $('input', el);
|
|
$.on(input, 'change', this.toggle);
|
|
$.sync('Header catalog links', CatalogLinks.set);
|
|
return Header.menu.addEntry({
|
|
el,
|
|
order: 95
|
|
});
|
|
}
|
|
},
|
|
|
|
node() {
|
|
for (var a of $$('a', this.nodes.comment)) {
|
|
var m;
|
|
if (m = a.href.match(/^https?:\/\/(boards\.4chan(?:nel)?\.org\/[^\/]+)\/catalog(#s=.*)?/)) {
|
|
a.href = `//${m[1]}/${m[2] || '#catalog'}`;
|
|
}
|
|
}
|
|
},
|
|
|
|
toggle() {
|
|
$.event('CloseMenu');
|
|
$.set('Header catalog links', this.checked);
|
|
return CatalogLinks.set(this.checked);
|
|
},
|
|
|
|
set(useCatalog) {
|
|
Conf['Header catalog links'] = useCatalog;
|
|
CatalogLinks.setLinks(Header.boardList);
|
|
CatalogLinks.setLinks(Header.bottomBoardList);
|
|
CatalogLinks.el.title = `Turn catalog links ${useCatalog ? 'off' : 'on'}.`;
|
|
return $('input', CatalogLinks.el).checked = useCatalog;
|
|
},
|
|
|
|
// Also called by Header when board lists are loaded / generated.
|
|
setLinks(list) {
|
|
if ((!(CatalogLinks.enabled ?? Conf['Catalog Links'])) || !list) { return; }
|
|
|
|
// do not transform links unless they differ from the expected value at most by this tail
|
|
const tail = /(?:index)?(?:\.\w+)?$/;
|
|
|
|
for (var a of $$('a:not([data-only])', list)) {
|
|
var {siteID, boardID} = a.dataset;
|
|
if (!siteID || !boardID) {
|
|
var VIEW;
|
|
({siteID, boardID, VIEW} = Site.parseURL(a));
|
|
if (
|
|
!siteID || !boardID ||
|
|
!['index', 'catalog'].includes(VIEW) ||
|
|
(!a.dataset.indexOptions && (a.href.replace(tail, '') !== (Get.url(VIEW, {siteID, boardID}) || '').replace(tail, '')))
|
|
) { continue; }
|
|
$.extend(a.dataset, {siteID, boardID});
|
|
}
|
|
|
|
var board = {siteID, boardID};
|
|
var url = Conf['Header catalog links'] ? CatalogLinks.catalog(board) : Get.url('index', board);
|
|
if (url) {
|
|
a.href = url;
|
|
if (a.dataset.indexOptions && (url.split('#')[0] === Get.url('index', board))) {
|
|
a.href += (a.hash ? '/' : '#') + a.dataset.indexOptions;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
externalParse() {
|
|
CatalogLinks.externalList = $.dict();
|
|
for (var line of Conf['externalCatalogURLs'].split('\n')) {
|
|
if (line[0] === '#') { continue; }
|
|
var url = line.split(';')[0];
|
|
var boards = Filter.parseBoards(line.match(/;boards:([^;]+)/)?.[1] || '*');
|
|
var excludes = Filter.parseBoards(line.match(/;exclude:([^;]+)/)?.[1]) || $.dict();
|
|
for (var board in boards) {
|
|
if (!excludes[board] && !excludes[board.split('/')[0] + '/*']) {
|
|
CatalogLinks.externalList[board] = url;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
external({siteID, boardID}) {
|
|
if (!CatalogLinks.externalList) { CatalogLinks.externalParse(); }
|
|
const external = (CatalogLinks.externalList[`${siteID}/${boardID}`] || CatalogLinks.externalList[`${siteID}/*`]);
|
|
if (external) { return external.replace(/%board/g, boardID); } else { return undefined; }
|
|
},
|
|
|
|
jsonIndex(board, hash) {
|
|
if ((g.SITE.ID === board.siteID) && (g.BOARD.ID === board.boardID) && (g.VIEW === 'index')) {
|
|
return hash;
|
|
} else {
|
|
return Get.url('index', board) + hash;
|
|
}
|
|
},
|
|
|
|
catalog(board=g.BOARD) {
|
|
let external, nativeCatalog;
|
|
if (Conf['External Catalog'] && (external = CatalogLinks.external(board))) {
|
|
return external;
|
|
} else if (Index.enabledOn(board) && Conf['Use <%= meta.name %> Catalog']) {
|
|
return CatalogLinks.jsonIndex(board, '#catalog');
|
|
} else if (nativeCatalog = Get.url('catalog', board)) {
|
|
return nativeCatalog;
|
|
} else {
|
|
return CatalogLinks.external(board);
|
|
}
|
|
},
|
|
|
|
index(board=g.BOARD) {
|
|
if (Index.enabledOn(board)) {
|
|
return CatalogLinks.jsonIndex(board, '#index');
|
|
} else {
|
|
return Get.url('index', board);
|
|
}
|
|
}
|
|
};
|