4chan-x/src/Miscellaneous/CatalogLinks.js
ccd0 98dcd7cd34 Rename files from .coffee to .js.
for f in src/*/*.coffee; do git mv -- "$f" "${f/.coffee/.js}"; done
2023-03-13 13:07:48 -07:00

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);
}
}
};