This commit is contained in:
Simon Gardling 2022-02-17 10:50:53 -05:00
parent 95b57f711c
commit 0154ff3933
2 changed files with 34 additions and 22 deletions

View File

@ -8,7 +8,7 @@ use std::panic;
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use web_sys::HtmlCanvasElement; use web_sys::HtmlCanvasElement;
mod misc; mod misc;
use crate::misc::{Cache, ChartOutput, DrawResult, add_asterisks}; use crate::misc::{add_asterisks, Cache, ChartOutput, DrawResult};
#[global_allocator] #[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
@ -90,7 +90,7 @@ impl ChartManager {
#[inline] #[inline]
fn draw( fn draw(
&mut self, element: HtmlCanvasElement, dark_mode: bool &mut self, element: HtmlCanvasElement, dark_mode: bool,
) -> DrawResult<(impl Fn((i32, i32)) -> Option<(f32, f32)>, f32)> { ) -> DrawResult<(impl Fn((i32, i32)) -> Option<(f32, f32)>, f32)> {
let func = self.get_func(); let func = self.get_func();
@ -112,7 +112,12 @@ impl ChartManager {
.build_cartesian_2d(self.min_x..self.max_x, self.min_y..self.max_y)?; .build_cartesian_2d(self.min_x..self.max_x, self.min_y..self.max_y)?;
if dark_mode { if dark_mode {
chart.configure_mesh().x_labels(3).y_labels(3).light_line_style(&RGBColor(254, 254, 254)).draw()?; chart
.configure_mesh()
.x_labels(3)
.y_labels(3)
.light_line_style(&RGBColor(254, 254, 254))
.draw()?;
} else { } else {
chart.configure_mesh().x_labels(3).y_labels(3).draw()?; chart.configure_mesh().x_labels(3).y_labels(3).draw()?;
} }
@ -185,19 +190,17 @@ impl ChartManager {
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
pub fn update( pub fn update(
&mut self, canvas: HtmlCanvasElement, func_str_new: String, min_x: f32, max_x: f32, min_y: f32, &mut self, canvas: HtmlCanvasElement, func_str_new: String, min_x: f32, max_x: f32,
max_y: f32, num_interval: usize, resolution: usize, dark_mode: bool min_y: f32, max_y: f32, num_interval: usize, resolution: usize, dark_mode: bool,
) -> Result<ChartOutput, JsValue> { ) -> Result<ChartOutput, JsValue> {
let func_str: String = add_asterisks(func_str_new); let func_str: String = add_asterisks(func_str_new);
let underlying_update = (func_str != self.func_str) let underlying_update = (func_str != self.func_str)
| (min_x != self.min_x) | (min_x != self.min_x)
| (max_x != self.max_x) | (max_x != self.max_x)
| (min_y != self.min_y) | (min_y != self.min_y)
| (max_y != self.max_y); | (max_y != self.max_y);
if underlying_update | (self.resolution != resolution) { if underlying_update | (self.resolution != resolution) {
self.back_cache.invalidate(); self.back_cache.invalidate();
} }
@ -214,7 +217,9 @@ impl ChartManager {
self.num_interval = num_interval; self.num_interval = num_interval;
self.resolution = resolution; self.resolution = resolution;
let draw_output = self.draw(canvas, dark_mode).map_err(|err| err.to_string())?; let draw_output = self
.draw(canvas, dark_mode)
.map_err(|err| err.to_string())?;
let map_coord = draw_output.0; let map_coord = draw_output.0;
let chart_output = ChartOutput { let chart_output = ChartOutput {

View File

@ -7,7 +7,9 @@ pub type DrawResult<T> = Result<T, Box<dyn std::error::Error>>;
pub fn add_asterisks(function_in: String) -> String { pub fn add_asterisks(function_in: String) -> String {
let function = function_in.replace("log10(", "log("); // replace log10 with log let function = function_in.replace("log10(", "log("); // replace log10 with log
let valid_variables: Vec<char> = "xe".chars().collect(); let valid_variables: Vec<char> = "xe".chars().collect();
let letters: Vec<char>= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".chars().collect(); let letters: Vec<char> = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.chars()
.collect();
let numbers: Vec<char> = "0123456789".chars().collect(); let numbers: Vec<char> = "0123456789".chars().collect();
let function_chars: Vec<char> = function.chars().collect(); let function_chars: Vec<char> = function.chars().collect();
let func_chars_len = function_chars.len(); let func_chars_len = function_chars.len();
@ -16,27 +18,27 @@ pub fn add_asterisks(function_in: String) -> String {
for c in function_chars.clone() { for c in function_chars.clone() {
let mut add_asterisk: bool = false; let mut add_asterisk: bool = false;
let prev_chars_len = prev_chars.len(); let prev_chars_len = prev_chars.len();
let curr_i: usize = func_chars_len-prev_chars_len; let curr_i: usize = func_chars_len - prev_chars_len;
let prev_prev_char = if prev_chars_len >= 2 { let prev_prev_char = if prev_chars_len >= 2 {
match prev_chars.get(prev_chars_len-2) { match prev_chars.get(prev_chars_len - 2) {
Some(x) => *x, Some(x) => *x,
None => panic!() None => panic!(),
} }
} else { } else {
' ' ' '
}; };
let prev_char = if prev_chars_len >= 1 { let prev_char = if prev_chars_len >= 1 {
match prev_chars.get(prev_chars_len-1) { match prev_chars.get(prev_chars_len - 1) {
Some(x) => *x, Some(x) => *x,
None => panic!() None => panic!(),
} }
} else { } else {
' ' ' '
}; };
let for_char = match function_chars.get(curr_i) { let for_char = match function_chars.get(curr_i) {
Some(x) => *x, Some(x) => *x,
None => ' ', None => ' ',
}; };
@ -44,13 +46,16 @@ pub fn add_asterisks(function_in: String) -> String {
let prev_pi = (prev_prev_char == 'p') && (prev_char == 'i'); let prev_pi = (prev_prev_char == 'p') && (prev_char == 'i');
let for_pi = (for_char == 'i') && (c == 'p'); let for_pi = (for_char == 'i') && (c == 'p');
if prev_char == ')' { if prev_char == ')' {
if (c == '(') | numbers.contains(&c) | letters.contains(&c) { if (c == '(') | numbers.contains(&c) | letters.contains(&c) {
add_asterisk = true; add_asterisk = true;
} }
} else if c == '(' { } else if c == '(' {
if (valid_variables.contains(&prev_char) | (prev_char == ')') | numbers.contains(&prev_char)) && !letters.contains(&prev_prev_char) { if (valid_variables.contains(&prev_char)
| (prev_char == ')')
| numbers.contains(&prev_char))
&& !letters.contains(&prev_prev_char)
{
add_asterisk = true; add_asterisk = true;
} else if prev_pi { } else if prev_pi {
add_asterisk = true; add_asterisk = true;
@ -62,7 +67,9 @@ pub fn add_asterisks(function_in: String) -> String {
} else if letters.contains(&c) { } else if letters.contains(&c) {
if numbers.contains(&prev_char) { if numbers.contains(&prev_char) {
add_asterisk = true; add_asterisk = true;
} else if (valid_variables.contains(&prev_char) && valid_variables.contains(&c)) | prev_pi { } else if (valid_variables.contains(&prev_char) && valid_variables.contains(&c))
| prev_pi
{
add_asterisk = true; add_asterisk = true;
} }
} else if numbers.contains(&c) { } else if numbers.contains(&c) {