koishi-plugin-mediawiki
Version:
MediaWiki for koishijs
60 lines (59 loc) • 1.95 kB
JavaScript
import { MediaWikiApi } from 'wiki-saikou';
import { resolveBrackets } from './resolveBrackets';
const MOCK_HEADERS = [
{
match: (url) => url.hostname.includes('huijiwiki.com'),
headers: {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67',
},
},
];
export function useApi(baseURL) {
const api = new MediaWikiApi(baseURL);
const matchedMockHeader = MOCK_HEADERS.find((item) => item.match(new URL(baseURL)));
if (matchedMockHeader) {
api.request.interceptors.request.use((ctx) => {
ctx.headers = { ...ctx.headers, ...matchedMockHeader.headers };
return ctx;
});
}
return api;
}
export function getWikiTitleDBKey(raw) {
const title = raw
.replace(/[\s_]+/g, ' ')
.trim()
.replace(/\s+/g, '_');
return title[0].toUpperCase() + title.slice(1);
}
export function getWikiDisplayTitle(raw) {
const title = raw.replace(/[\s_]+/g, ' ').trim();
return title[0].toUpperCase() + title.slice(1);
}
export function parseTitlesFromText(str) {
str = resolveBrackets(str);
const reg = /\[\[(.+?)\]\]/g;
return Array.from(new Set(Array.from(str.matchAll(reg))
.map((i) => i[1].split('|')[0])
.map(getWikiTitleDBKey))).filter((i) => !!i);
}
export function getUrl(base, params = {}, script = 'index') {
const query = Object.keys(params).length
? '?' + new URLSearchParams(params)
: '';
return `${base.replace('/api.php', `/${script ? script.trim() : 'index'}.php`)}${query}`;
}
export function isValidApi(api) {
let url;
try {
url = new URL(api);
}
catch (err) {
return false;
}
const { protocol, pathname } = url;
if (protocol.startsWith('http') && pathname.endsWith('/api.php')) {
return true;
}
return false;
}