import { AutoloadPage } from 'vj/misc/Page'; import request from 'vj/utils/request'; export default new AutoloadPage('media', async () => { async function parseMedia($dom = $(document.body)) { const items = []; const resolvers = []; const users = $dom.find('div[data-user]'); const resolve = (ele, item) => { items.push(item); resolvers.push((html) => html && $(ele).replaceWith($(html))); }; users.get().forEach((ele) => resolve(ele, { type: 'user', id: +$(ele).text() })); $dom.find('.typo').get().forEach((el) => { if (el.className.includes('no-media')) return; $(el).find('a[href]').get().forEach((ele) => { if ($(ele).parent().hasClass('user-profile-link')) return; let target = $(ele).attr('href'); let { domainId } = UiContext; if (target.startsWith(UiContext.url_prefix)) { target.replace(UiContext.url_prefix, ''); if (!target.startsWith('/')) target = `/${target}`; } if (!target.startsWith('/') || target.startsWith('//')) return; if (target.startsWith('/d/')) { const [, , domain, ...extra] = target.split('/'); domainId = domain; target = `/${extra.join('/')}`; } const [, category, data, extra] = target.split('/'); if (!data) return; if (category === 'user' && Number.isInteger(+data) && !extra) resolve(ele, { type: 'user', id: +data }); if (category === 'p' && !extra) resolve(ele, { type: 'problem', id: data, domainId }); if (category === 'contest' && !extra) resolve(ele, { type: 'contest', id: data, domainId }); }); }); if (!items.length) return; const res = await request.post(`/d/${UiContext.domainId}/media`, { items }); for (let i = 0; i < res.length; i++) resolvers[i](res[i]); } await parseMedia(); $(document).on('vjContentNew', (e) => parseMedia($(e.target))); });