Library for Calculator (Graphing)
This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/503150/1425747/Graphing%20Plugin.js
// ==UserScript== // @name Graphing Plugin // @namespace https://greasyfork.org/en/users/1291009 // @author BadOrBest // @license MIT // @version 1.4 // @description A library for adding and managing graphs on any webpage. // @grant none // @require https://cdnjs.cloudflare.com/ajax/libs/mathjs/13.0.3/math.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.min.js // ==/UserScript== (function(global) { 'use strict'; console.log('Graphing Library loaded'); global.GraphingLibrary = { chartInstance: null, createCanvas: function() { let canvas = document.getElementById('graphCanvas'); if (!canvas) { canvas = document.createElement('canvas'); canvas.id = 'graphCanvas'; canvas.style.position = 'fixed'; canvas.style.bottom = '0'; canvas.style.right = '0'; canvas.style.zIndex = '9999'; canvas.style.width = '600px'; // Set canvas width canvas.style.height = '400px'; // Set canvas height document.body.appendChild(canvas); console.log('Canvas created'); } return canvas; }, updateGraph: function() { console.log('Updating graph'); const graphData = JSON.parse(localStorage.getItem('graphData') || '[]'); const canvas = this.createCanvas(); const ctx = canvas.getContext('2d'); if (this.chartInstance) { this.chartInstance.destroy(); } this.chartInstance = new Chart(ctx, { type: 'line', data: { datasets: graphData.map(data => ({ label: data.label, data: data.points, borderColor: data.color || 'blue', borderWidth: 1, fill: false })) }, options: { scales: { x: { type: 'linear', position: 'bottom' } } } }); }, toggleGraph: function() { const canvas = this.createCanvas(); canvas.style.display = canvas.style.display === 'none' ? 'block' : 'none'; if (canvas.style.display === 'block') { this.updateGraph(); } console.log('Toggled graph display'); }, clearGraph: function() { localStorage.setItem('graphData', JSON.stringify([])); const canvas = document.getElementById('graphCanvas'); if (canvas) { canvas.style.display = 'none'; } if (this.chartInstance) { this.chartInstance.destroy(); this.chartInstance = null; } console.log('Cleared graph data'); }, addGraphData: function(expression) { if (expression) { try { const xValues = Array.from({ length: 100 }, (_, i) => i - 50); // X values from -50 to 50 const yValues = xValues.map(x => math.evaluate(expression.replace(/x/g, x))); // Evaluate expression const newGraphData = JSON.parse(localStorage.getItem('graphData') || '[]'); newGraphData.push({ label: `Graph ${newGraphData.length + 1}`, points: xValues.map((x, i) => ({ x, y: yValues[i] })) }); localStorage.setItem('graphData', JSON.stringify(newGraphData)); this.updateGraph(); console.log('Added graph data'); } catch (error) { alert('Error evaluating expression: ' + error.message); console.error('Error evaluating expression:', error); } } } }; // Initialize or update the graph display if needed if (JSON.parse(localStorage.getItem('graphData') || '[]').length > 0) { GraphingLibrary.toggleGraph(); } })(window);