Greasy Fork is available in English.

ChatPaper-Click

Jump to translation from any arxiv papaers!

질문, 리뷰하거나, 이 스크립트를 신고하세요.
// ==UserScript==
// @name         ChatPaper-Click
// @namespace    http://tampermonkey.net/
// @version      2.2.1
// @description  Jump to translation from any arxiv papaers!
// @author       ziuch
// @match        https://arxiv.org/abs/*
// @match        https://arxiv.org/pdf/*
// @match        *://*/*.pdf
// @exclude      https://chatpaper.click/*
// @icon         https://img.ziuch.top/i/2023/12/20/sdrlap-2.webp
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';
  // Your code here...
  let base_url = 'https://chatpaper.click'
  if (window.top !== window.self) {
    return
  }
  function _appendCss(css, name) {
    var head = document.head || document.getElementsByTagName('head')[0];
    var style = document.createElement('style');
    style.setAttribute("data-component", name);
    style.innerHTML = css;
    head.appendChild(style);

      // Create a new style element
      var style1 = document.createElement('style');
      style.type = 'text/css';

      // Define your keyframes and other CSS as a string
      var keyFrames = `
@keyframes pulse {
    0% {
        transform: scale(1);
        opacity: 1;
    }
    50% {
        transform: scale(1.125);
        opacity: 0.85;
    }
    100% {
        transform: scale(1);
        opacity: 1;
    }
}`;

      // Set the innerHTML of the style element to your CSS string
      style1.innerHTML = keyFrames;

      // Append the style element to the head of the document
      document.head.appendChild(style1);

  }
  function addStyle() {
    //debugger;
    let via_markdown_css = `.via-markdown-btn{display: inline-block; vertical-align: middle; height: 50px; width:50px; border: 1px solid transparent; padding: 0 18px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center; font-size: 18px; border-radius: 2px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}.via-markdown-btn-sm{height: 20px; line-height: 20px; padding: 0 6px; font-size: 18px;}`;
    _appendCss(via_markdown_css, "btn");
  }
  //创建解析按钮
  function addAnalysisBtn() {
    var btn = document.createElement('button');
    btn.style = "top: 220px;left:8px; position: fixed;z-index:1000;cursor:pointer;background:rgba(112, 165, 151,0.9);height: 50px;wight:50px;border-radius: 50%; animation: pulse 2s infinite;font-size: 16px;"
    btn.className = "via-markdown-btn via-markdown-btn-sm"
    btn.innerHTML = "解析"
    btn.id = "analysisBtn"
    document.body.appendChild(btn);
  }

  //创建翻译按钮
  function addTranslateBtn() {
    var btn = document.createElement('button');
    btn.style = "top: 280px;left:8px; position: fixed;z-index:1000;cursor:pointer;background:rgba( 15,  43,  70, 0.9);height: 50px;wight:50px;border-radius: 50%; animation: pulse 2s infinite;font-size: 16px;"
    btn.className = "via-markdown-btn via-markdown-btn-sm"
    btn.innerHTML = "翻译"
    btn.id = "translateBtn"
    document.body.appendChild(btn);
  }

  //创建下载按钮
  function addDownloadBtn() {
    var btn = document.createElement('button');
    btn.style = "top: 340px;left:8px; position: fixed;z-index:1000;cursor:pointer;background:rgba(0, 143, 242, 0.9);height: 50px;wight:50px;border-radius: 50%; animation: pulse 2s infinite;font-size: 16px;"
    btn.className = "via-markdown-btn via-markdown-btn-sm"
    btn.innerHTML = "下载"
    btn.id = "downloadBtn"
    // document.body.appendChild(btn);
  }

  addStyle();
  addAnalysisBtn();
  addTranslateBtn();
  addDownloadBtn();

  function adjust(url) {
      // 定义匹配规则的正则表达式
      var regex = /^https:\/\/arxiv\.org\/abs\/(.+)$/;

      // 使用正则表达式进行匹配
      var match = url.match(regex);

      if (match) {
          // 提取匹配到的部分(xxx)
          var identifier = match[1];

          // 构建新的URL
          url = 'https://arxiv.org/pdf/' + identifier + '.pdf';
      }
      return url
  }

  var $analysisBtn = document.getElementById("analysisBtn")
  $analysisBtn.addEventListener("click", Analysis);
  document.addEventListener("dblclick",Analysis);
  function Analysis() {
      //var password = prompt("请输入访问密码");
      var url = `${document.URL}`
      url = adjust(url);
      window.open(base_url + '/analysis?pdf_url=' + url)
  }

  var $translateBtn = document.getElementById("translateBtn")
  $translateBtn.addEventListener("click", Translate);
  document.addEventListener("dblclick",Translate);
  function Translate() {
      var url = `${document.URL}`
      console.log("orgin => " + url);
      if (!url.includes('arxiv')) {
          alert('该功能暂时只能在arxiv上使用!')
          return
      }
      // 使用 replace 方法进行替换
      var target_url = url.replace('arxiv', 'ar5iv');
      console.log("new => " + target_url);
      window.open(target_url);
  }

//   var $downloadBtn = document.getElementById("downloadBtn")
//   $downloadBtn.addEventListener("click", Download);
//   document.addEventListener("dblclick",Download);
  function Download() {
      var password = prompt("请输入访问密码");
      var url = `${document.URL}`
      url = adjust(url)
      // alert(url);
      var xhr = new XMLHttpRequest();
      xhr.open('POST', base_url + '/download', true);
      xhr.setRequestHeader('Content-Type', 'application/json');
      xhr.responseType = 'blob';

      xhr.onload = function () {
          if (this.status === 200) {
              var url = window.URL.createObjectURL(this.response);
              var a = document.createElement('a');
              a.href = url;
              a.download = 'downloaded_file';
              document.body.appendChild(a);
              a.click();
              window.URL.revokeObjectURL(url);
          } else {
              // document.getElementById('errorMessage').innerText = '文件下载失败。';
              alert('密码错误或文件下载失败。');
          }
      };

      xhr.onerror = function () {
          // document.getElementById('errorMessage').innerText = '网络错误。';
          alert('网络错误。');
      };

      xhr.send(JSON.stringify({url: url, password:password}));
  }
})();