🏠 Home 

扇贝辅助

不用贝壳即可查看听力提示, 修改导航栏,方便炼句


Install this script?
// ==UserScript==
// @name         扇贝辅助
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  不用贝壳即可查看听力提示, 修改导航栏,方便炼句
// @author       How
// @match        https://www.shanbay.com/*
// @match        https://web.shanbay.com/*
// @grant        none
// ==/UserScript==
(function() {
'use strict';
// 一些变量
window.shanbayLinks = {
'sentence-review': 'https://www.shanbay.com/sentence/review/',
'listen-link': 'https://www.shanbay.com/listen/',
'listen-with-hint': [ 'https://www.shanbay.com/listen/sentence',
'https://www.shanbay.com/listen/review'],
};
window.shanbayConfig = {
/* 修改“听力”链接,使其指向“精听”页面,而不是让我下载手机app */
'change-listen-nav': true,
/* 在导航栏插入“炼句”的tab */
'insert-sentence-review-nav': true,
/* 听听力的时候,免费查看提示 */
'free-listen-hint': true,
}
window.shanbayScript = {}
window.shanbayScript.hint_input_dom = undefined;
// Your code here...
// 修改导航栏
changeNavBar();
// 修改听力页面,添加一个悬停在页面中的按钮
let changedPage = false;
if (window.shanbayConfig['free-listen-hint']) {
for (let i = 0 ; i < window.shanbayLinks['listen-with-hint'].length ; i++) {
console.log('trigger');
if (!changedPage && window.location.href.startsWith(window.shanbayLinks['listen-with-hint'][i])) {
changeListenPage();
changedPage = true;
}
}
}
/*
if (window.location.href.startsWith('https://www.shanbay.com/listen/sentence')) {
changeListenPage();
}
*/
})();
// 找到所有空里面获得焦点的空,如果没有,就找第一个不正确的,不正确包括空白,返回这个DOM
// 如果没找到,返回undefined
function findFirstIncorrectBlank() {
let inputs = document.getElementsByClassName('sentence-word-input');
let res = undefined;// 如果没有光标所指的input,返回第一个非正确的
for (let i = 0 ; i < inputs.length ; i++) {
if (res == undefined && (inputs[i].value == '' || !inputs[i].classList.contains('correct-answer'))) {
res = inputs[i];
}
// 如果有获得焦点的空,返回这个空的dom
if (res != undefined && inputs[i] === document.activeElement) {
return inputs[i];
}
}
return res;
}
function displayListenHint() {
let dom = findFirstIncorrectBlank();
if (dom == undefined) {
document.getElementById('hint-button').value = 'Not here';
return;
}
window.shanbayScript.hint_input_dom = dom;
document.getElementById('hint-button').value = dom.getAttribute('data');
dom.placeholder = dom.getAttribute('data');
}
function hideListenHint() {
document.getElementById('hint-button').value = 'Hint';
if (window.shanbayScript.hint_input_dom == undefined) {
return;
}
window.shanbayScript.hint_input_dom.placeholder = '';
}
// 设置element为可拖拽
function dragElement(element) {
var posX;// 原来鼠标的位置
var posY;
var posXX;// 拖拽之后鼠标的位置
var posYY;
function pressed(event) {
event = event || window.event;
event.preventDefault;
posX = event.clientX;
posY = event.clientY;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', released);
}
function released(event) {
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', released);
}
function drag(event) {
event = event || window.event;
event.preventDefault;
let deltaX = event.clientX - posX;
let deltaY = event.clientY - posY;
posX = event.clientX;
posY = event.clientY; console.log(element.offsetTop);
element.style.top = element.offsetTop + deltaY + 'px';
element.style.left = element.offsetLeft + deltaX + 'px';
}
element.onmousedown = pressed;
}
function changeListenPage() {
let button = document.createElement('input');
button.type='button';
button.style.position = 'fixed';
button.style['z-index'] = '10';
button.style.top = '50%';
button.style.left = '15%';
button.id = 'hint-button';
button.value = 'Hint';
button.draggable = false;
// 设置拖拽
dragElement(button);
// 悬停事件
button.addEventListener('mouseover', displayListenHint);
button.addEventListener('mouseout', hideListenHint);
// todo 懒得美化
document.body.appendChild(button);
}
// 唉!扇贝的页面连导航栏的结构都不一样,要分页面来处理,真坑,[todo]
function changeNavBar() {
let navHandlerOfPage = {
'https://web.shanbay.com/wordsweb': changeNavBarOnWordPage,
'https://www.shanbay.com/news': changeNavBarOnSpeakAndReadPage,
'https://web.shanbay.com/reading': changeNavBarOnSpeakAndReadPage,
'https://www.shanbay.com/speak': changeNavBarOnSpeakAndReadPage,
'https://www.shanbay.com': changeNavBarOnNormalPage,
};
for (let url in navHandlerOfPage) {
if (window.location.href.startsWith(url)) {
navHandlerOfPage[url](); break;
}
}
}
// 一般性的页面,有统一的navbar结构
function changeNavBarOnNormalPage() {
let nav = document.getElementsByClassName('nav')[0];
let navlinks = nav.getElementsByClassName('main-menu');
let tab = '<li class="dropdown main-nav  ">'+
'<a href="' + shanbayLinks['sentence-review'] + '" class="main-menu">' +
'炼句' +
'</a>'+
' </li>';
for (let i = 0 ; i < navlinks.length ; i++) {
// 修改听力链接
if (navlinks[i].innerText.trim() == '听力' && window.shanbayConfig['change-listen-nav']) {
navlinks[i].href = window.shanbayLinks['listen-link'];
}
}
if (window.shanbayConfig['insert-sentence-review-nav']) {
nav.innerHTML += tab;// 增加炼句导航
}
}
// 修改记单词界面的navbar
function changeNavBarOnWordPage() {
// todo: the class name might change
let nav = document.getElementsByClassName('Nav_itemsWrapper__3FUxo')[0];
if (nav === undefined)
return;
let navlinks = nav.getElementsByTagName('a');
let tab = '<a class="Nav_item__TffFb" href="' + shanbayLinks['sentence-review'] + '">炼句</a>';
for (let i = 0 ; i < navlinks.length ; i++) {
// 修改听力链接
if (navlinks[i].innerText.trim() == '听力' && window.shanbayConfig['change-listen-nav']) {
navlinks[i].href = window.shanbayLinks['listen-link'];
}
}
if (window.shanbayConfig['insert-sentence-review-nav']) {
nav.innerHTML += tab;// 增加炼句导航
}
}
// 口语和阅读的navbar结构一样
function changeNavBarOnSpeakAndReadPage() {
let nav = document.getElementsByClassName('nav-top-left')[0];
let navlinks = nav.getElementsByClassName('secondary');
let tab = '<li>'+
'<a class="secondary" href="' + shanbayLinks['sentence-review'] + '" class="main-menu">' +
'炼句' +
'</a>'+
' </li>';
for (let i = 0 ; i < navlinks.length ; i++) {
// 修改听力链接
if (navlinks[i].innerText.trim() == '听力' && window.shanbayConfig['change-listen-nav']) {
navlinks[i].href = window.shanbayLinks['listen-link'];
}
}
if (window.shanbayConfig['insert-sentence-review-nav']) {
nav.getElementsByTagName('ul')[0].innerHTML += tab;// 增加炼句导航
}
}