HTML version of arxiv & AI chat for arxiv
// ==UserScript== // @name arxiv-extensions // @namespace http://tampermonkey.net/ // @version 0.3 // @description HTML version of arxiv & AI chat for arxiv // @author [email protected] // @match https://arxiv.org/abs/* // @icon https://www.google.com/s2/favicons?sz=64&domain=arxiv.org // @grant GM_openInTab // @license MIT // ==/UserScript== (function() { 'use strict'; // 1. Create HTML/vanity/AI Chat link const createLink = function(name, url) { const link = document.createElement('a'); link.style.cssText = `display: inline-block; border-left: 2px solid #fff; padding-left: 10px; margin-left: 10px;`; link.target = '_blank'; link.href = url; link.textContent = name; return link; }; const href = window.location.href; const htmlVersionEntry = createLink('HTML(ar5iv)', href.replace('arxiv.org', 'ar5iv.org')); const htmlVersionFromVanity = createLink('HTML(vanity)', href.replace('arxiv.org', 'www.arxiv-vanity.com').replace('/pdf/', '/papers/').replace('.pdf', '/')); const aiChatEntry = createLink('AI Chat', href.replace('arxiv.org', 'arxiw.org')); const target = document.querySelector('.header-breadcrumbs'); target.appendChild(htmlVersionEntry); target.appendChild(htmlVersionFromVanity); target.appendChild(aiChatEntry); // 2. Open HTML or PDF in new tab const match = href.match(/arxiv\.org\/abs\/([a-zA-Z0-9.-]+(?:v\d+)?)/); if (!match) return; const id = match[1]; const htmlUrl = `https://arxiv.org/html/${id}`; const pdfUrl = `https://arxiv.org/pdf/${id}.pdf`; fetch(htmlUrl, { method: 'HEAD' }). then(resp => { if (resp.ok && resp.headers.get('content-type')?.includes('html')) { GM_openInTab(htmlUrl, { active: false, insert: true, setParent: true }); } else { GM_openInTab(pdfUrl, { active: false, insert: true, setParent: true }); } }).catch(() => { GM_openInTab(pdfUrl, { active: false, insert: true, setParent: true }); }); })();