mirror of
https://github.com/lebr0nli/slader-extension.git
synced 2025-05-30 20:27:04 +00:00
Proof of Concept
This commit is contained in:
parent
e2a9788169
commit
555b925c2c
15355
deleteme.html
Normal file
15355
deleteme.html
Normal file
File diff suppressed because it is too large
Load diff
1
slader-limit-bypass/js/katex/autorender.js
Normal file
1
slader-limit-bypass/js/katex/autorender.js
Normal file
|
@ -0,0 +1 @@
|
|||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={974:function(t){t.exports=e}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var a={};return function(){n.d(a,{default:function(){return s}});var e=n(974),t=n.n(e),r=function(e,t,r){for(var n=r,a=0,i=e.length;n<t.length;){var o=t[n];if(a<=0&&t.slice(n,n+i)===e)return n;"\\"===o?n++:"{"===o?a++:"}"===o&&a--,n++}return-1},i=/^\\begin{/,o=function(e,t){for(var n,a=[],o=new RegExp("("+t.map((function(e){return e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})).join("|")+")");-1!==(n=e.search(o));){n>0&&(a.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=i.test(d)?d:e.slice(t[l].left.length,n);a.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&a.push({type:"text",data:e}),a},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var a=document.createDocumentFragment(),i=0;i<n.length;i++)if("text"===n[i].type)a.appendChild(document.createTextNode(n[i].data));else{var l=document.createElement("span"),d=n[i].data;r.displayMode=n[i].display;try{r.preProcess&&(d=r.preProcess(d)),t().render(d,l,r)}catch(e){if(!(e instanceof t().ParseError))throw e;r.errorCallback("KaTeX auto-render: Failed to parse `"+n[i].data+"` with ",e),a.appendChild(document.createTextNode(n[i].rawData));continue}a.appendChild(l)}return a},d=function e(t,r){for(var n=0;n<t.childNodes.length;n++){var a=t.childNodes[n];if(3===a.nodeType){var i=l(a.textContent,r);i&&(n+=i.childNodes.length-1,t.replaceChild(i,a))}else 1===a.nodeType&&function(){var t=" "+a.className+" ";-1===r.ignoredTags.indexOf(a.nodeName.toLowerCase())&&r.ignoredClasses.every((function(e){return-1===t.indexOf(" "+e+" ")}))&&e(a,r)}()}},s=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},d(e,r)}}(),a=a.default}()}));
|
18102
slader-limit-bypass/js/katex/katex.js
Normal file
18102
slader-limit-bypass/js/katex/katex.js
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,100 @@
|
|||
// TODO: Sidestep race condition in a less patchwork manner
|
||||
setTimeout(function(){ renderBypass(); /* TODO: Check if it actually went through */ }, 1250);
|
||||
|
||||
|
||||
function renderBypass()
|
||||
{
|
||||
// Setup page elements
|
||||
|
||||
//Get Katex CSS
|
||||
var katex_css = document.createElement('link');
|
||||
katex_css.setAttribute('rel','stylesheet');
|
||||
katex_css.setAttribute('href','https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.css ');
|
||||
document.head.appendChild(katex_css);
|
||||
|
||||
// Clear the "hidden explanation" out and replace it with a blank explanation area.
|
||||
// The innermost item is ".s1i7awl8"
|
||||
document.querySelector('main .mwhvwas').innerHTML = '<div class="c18oith1 sladerBypass"><div class="s1oluvjw"><h4 class="h1cwp1lk">Explanation</h4><div class="as7m9cv snqbbas"><div data-testid="ExplanationsSolution" class="e1sw891e"><div class="s1i7awl8"></div></div></div></div></div>';
|
||||
var expArea = document.querySelector('.sladerBypass .s1i7awl8')
|
||||
|
||||
// Render new stuff
|
||||
|
||||
// Get the webpage data, devoid of any headers or cookies. Acts as if the user is not logged in at all.
|
||||
var data = httpGet(window.location);
|
||||
|
||||
// Is this an abomination? Yes.
|
||||
// Does it work? Also yes.
|
||||
//
|
||||
// ...
|
||||
//
|
||||
// I don't want to talk about it.
|
||||
//
|
||||
var b = data.match(/(?<=window.Quizlet\["questionDetailsPageData"] = ).+?(?=; QLoad\("Quizlet.questionDetailsPageData")/gm);
|
||||
if (!b)
|
||||
{
|
||||
expArea.innerHTML = `<div style="color: red;"><h1>You have been ratelimited by Quizlet</h1><br>Try clearing your cookies for Quizlet.<br>— Slader Bypass</div>`;
|
||||
}
|
||||
|
||||
// TODO: Branch off to handle textbookExercisePageData. See line 1349 in "deleteme.html".
|
||||
|
||||
|
||||
// Parse JSON data
|
||||
var qDetails = JSON.parse(b[0]);
|
||||
|
||||
// Display JSON data as answer
|
||||
qDetails.question.solutions.forEach(solution => {
|
||||
const numSteps = solution.steps.length;
|
||||
solution.steps.forEach(step => {
|
||||
const stepNum = step.stepNumber;
|
||||
// Create card element
|
||||
var div = document.createElement('div');
|
||||
// Insert boilerplate card data
|
||||
div.innerHTML = '<div class="r8gl7vf" data-testid="ExplanationsSolutionStep" style="padding-top: 0.8rem;"><div class="AssemblyCard AssemblyMediumCard"><div class="ExplanationsSolutionCard c5ngj6s"><div class="h1ejaztj"><h4 class="s39tzu2"></h4><span class="sb9ch1t"></span></div><div class="s1wwu7g8"><div class="s1x7f4sz"><div class=""><div class="s1xkd811"><div class="mi4ni5d sladerBypassKatex" style="white-space: pre-wrap;"></div></div></div></div></div></div></div></div>';
|
||||
// Step X: .s39tzu2
|
||||
div.querySelector('.s39tzu2').innerHTML = (numSteps === stepNum) ? "Result" : "Step " + stepNum;
|
||||
// x of x: .sb9ch1t
|
||||
div.querySelector('.sb9ch1t').innerHTML = stepNum + ' of ' + numSteps;
|
||||
|
||||
// I'm not 100% on the structure of these, but I'll take a stab at it.
|
||||
// It seems that only one column is ever used. I'll iterate anyways, because I can't trust that.
|
||||
step.columns.forEach(column => {
|
||||
// Insert inner text
|
||||
div.querySelector('.sladerBypassKatex').textContent = column.text.replaceAll('\n\n\n', '\n\n'); // The replace call is a bit funky but it works.
|
||||
|
||||
// TODO: Handle column.images.additional
|
||||
});
|
||||
|
||||
// Append card to explanation area.
|
||||
expArea.appendChild(div);
|
||||
});
|
||||
});
|
||||
|
||||
// Render Katex for each card
|
||||
expArea.querySelectorAll('.sladerBypassKatex').forEach(textArea => {
|
||||
renderMathInElement(textArea, {
|
||||
delimiters: [
|
||||
{left: "$$", right: "$$", display: true},
|
||||
{left: "$", right: "$", display: false},
|
||||
{left: "\\(", right: "\\)", display: false},
|
||||
{left: "\\begin{equation}", right: "\\end{equation}", display: true},
|
||||
{left: "\\begin{align}", right: "\\end{align}", display: true},
|
||||
{left: "\\begin{alignat}", right: "\\end{alignat}", display: true},
|
||||
{left: "\\begin{gather}", right: "\\end{gather}", display: true},
|
||||
{left: "\\begin{CD}", right: "\\end{CD}", display: true},
|
||||
{left: "\\[", right: "\\]", display: true}
|
||||
],
|
||||
throwOnError : false
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Handle GET request
|
||||
function httpGet(url)
|
||||
{
|
||||
var req = new XMLHttpRequest();
|
||||
req.open( "GET", url, false ); // false -> synchronous request
|
||||
req.send( null );
|
||||
return req.responseText;
|
||||
}
|
|
@ -21,7 +21,7 @@
|
|||
},
|
||||
{
|
||||
"matches": ["*://quizlet.com/explanations/*"],
|
||||
"js": ["js/quizlet_bypass.js"]
|
||||
"js": ["js/katex/katex.js", "js/katex/autorender.js", "js/quizlet_bypass.js"]
|
||||
}
|
||||
],
|
||||
"manifest_version": 2
|
||||
|
|
Loading…
Reference in a new issue