Skip to content

Instantly share code, notes, and snippets.

View RaoHai's full-sized avatar
🎯
Focusing

Hai Rao RaoHai

🎯
Focusing
View GitHub Profile
@RaoHai
RaoHai / PRIVACY.md
Created September 15, 2026 05:22
Zuki Reader privacy policy

Zuki Reader 隐私政策

更新日期:2026 年 9 月 15 日

Zuki Reader 是在浏览器中运行的论文阅读扩展。它只在 arxiv.org 和用户允许访问的本地 PDF 文件中接管阅读页面;没有开发者运营的中转服务器,也不收集遥测或广告数据。

处理哪些数据

  • 为了显示论文,扩展读取当前 PDF 的网址、页面图像、可提取文本、目录、图表和引用信息。打开 arXiv 论文时,浏览器会从 arXiv 获取 PDF;打开本地文件时,扩展从用户选择的本地文件读取 PDF。
  • 用户主动翻译或开启自动翻译后,扩展会把相关 PDF 文本和翻译指令发送到用户在 Provider 配置中指定的 Endpoint。用户在 AI 阅读侧栏输入的问题及与之相关的论文上下文,也会发送到该 Endpoint。扩展不会为了翻译而上传整份 PDF 文件或独立上传图片。
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Keybase proof

I hereby claim:

  • I am RaoHai on github.
  • I am raohai (https://keybase.io/raohai) on keybase.
  • I have a public key whose fingerprint is C9BF EABD B2F5 49EF B234 1999 8416 6130 B3AD 7BB9

To claim this, I am signing this object:

@RaoHai
RaoHai / schema.ts
Last active February 15, 2025 10:40
class Chart {
changeData(arg: any) {}
axis(arg: any) {}
render() {}
}
function field(config: any) {
return function (target, propertyKey, descriptor) {};
}
@RaoHai
RaoHai / run.js
Created October 10, 2017 02:37
一键拉黑本页红卫兵
[].slice.call(document.querySelectorAll('.follow_item'))
.map(function(item) {
var d = item.getAttribute('action-data');
var data = /uid=(\d+)&/g.exec(d);
var uid = data && data[1];
if (uid) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://weibo.com/aj/f/addblack?ajwvr=6');
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
@RaoHai
RaoHai / upload.js
Created December 9, 2016 07:46
Simpe Image Resampling
// var fileInput = document.querySelector('file');
var targetWidth = 400;
var targetHeight = 400;
function doUpload () {
// upload picture
}
fileInput.onChange = function () {
var file = this.files[0];
@keyframes pop-upwards {
0% {
transform: matrix(.97,0,0,1,0,12);
opacity: 0
}
20% {
transform: matrix(.99,0,0,1,0,2);
opacity: .7
}
import React from 'react';
import classnames from 'classnames';
import './highlightMenu.less';
function getSelectionClientRect() {
const selection = window.getSelection();
console.log('> getSelectionClientRect', selection.rangeCount, selection.isCollapsed);
if (selection.rangeCount && !selection.isCollapsed ) {
const range = selection.getRangeAt(0).cloneRange();
return range.getBoundingClientRect && range.getBoundingClientRect();
import React from 'react';
import { Editor, EditorState } from 'draft-js';
import InlineStyles from '../InlineStyles';
export default class EditorCore extends React.Component {
constructor(props) {
super(props);
this.state = { editorState: EditorState.createEmpty() };
this.onChange = this._onChange.bind(this);
}
export default {
BOLD: {
fontWeight: 700,
},
ITALIC: {
fontStyle: 'italic',
},
};