From 6f15d6ff24f5a1db047ae55276353dea409d7bd6 Mon Sep 17 00:00:00 2001 From: Snowsune Date: Fri, 2 Jan 2026 19:21:40 -0500 Subject: [PATCH 1/3] Implement inital prototype with Vol's formula --- .gitignore | 1 + app/__init__.py | 117 +++++++++- app/species_data/african_buffalo.yaml | 6 + app/species_data/arctic_fox.yaml | 6 + app/species_data/canine.yaml | 6 + app/species_data/equine.yaml | 6 + app/species_data/feline.yaml | 6 + app/species_data/fennec_fox.yaml | 6 + app/species_data/giraffe.yaml | 6 + app/species_data/mouse.yaml | 6 + app/species_data/red_fox.yaml | 6 + app/species_data/saber-toothed_tiger.yaml | 6 + app/species_data/shark.yaml | 6 + app/species_data/wolf.yaml | 6 + app/static/css/taur_app.css | 150 ++++++++++++ .../images/taur/TaurCalculatorReference.png | Bin 0 -> 43238 bytes app/templates/taur.html | 219 +++++++++++++++++- app/utils/taur_calculator.py | 98 ++++++++ 18 files changed, 643 insertions(+), 14 deletions(-) create mode 100644 app/static/css/taur_app.css create mode 100644 app/static/images/taur/TaurCalculatorReference.png create mode 100644 app/utils/taur_calculator.py diff --git a/.gitignore b/.gitignore index 269d87a..3ab4911 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ cache .env *.sqlite3 art/dist/ +__pycache__ diff --git a/app/__init__.py b/app/__init__.py index e2d203a..65e92de 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -22,7 +22,11 @@ from functools import wraps from app.utils.species_lookup import load_species_data -from app.utils.calculate_heights import calculate_height_offset, convert_to_inches +from app.utils.calculate_heights import ( + calculate_height_offset, + convert_to_inches, + inches_to_feet_inches, +) from app.utils.parse_data import ( extract_characters, filter_valid_characters, @@ -34,6 +38,7 @@ from app.utils.stats import StatsManager from app.utils.generate_image import render_image from app.utils.character import Character +from app.utils.taur_calculator import calculate_taur app = Flask(__name__) app.secret_key = os.urandom(24) @@ -300,13 +305,117 @@ def add_preset(): return redirect(f"/?characters={characters_query}{settings_query}") -@app.route("/taur") +@app.route("/taur", methods=["GET", "POST"]) def taur(): """ - Base route for volnar's sub-page! + Taur calculator! + + Collaboration with Volnar <3 """ + # Filter out some ones we dont want to show/dont have data + filtered_species = [ + s + for s in species_list + if s not in ["taur_(generic)", "preset_species", "rexouium"] + ] + + # Load species data for auto-population + species_data_map = {} + for species_name in filtered_species: + try: + data = load_species_data(species_name) + # Extract species_length, species_tail_length, species_weight from male section + # and get a default species_height from the first data point + if "male" in data: + male_data = data["male"] + species_data_map[species_name] = { + "species_length": male_data.get("species_length", 0), + "species_tail_length": male_data.get("species_tail_length", 0), + "species_weight": male_data.get("species_weight", 0), + "species_height": ( + male_data.get("data", [{}])[0].get("height", 0) + if male_data.get("data") + else 0 + ), + } + except Exception as e: + logging.warning(f"Failed to load species data for {species_name}: {e}") + species_data_map[species_name] = { + "species_length": 0, + "species_tail_length": 0, + "species_weight": 0, + "species_height": 0, + } + + if request.method == "POST": + # POST when handling a form submission - redirect with URL parameters + params = {} + for key in [ + "name", + "measurement_type", + "anthro_height", + "species_height", + "species_length", + "species_tail_length", + "taur_full_height", + "species_weight", + "taur_length", + ]: + value = request.form.get(key, "") + if value: + params[key] = value + + query_string = "&".join([f"{k}={v}" for k, v in params.items()]) + return redirect(f"/taur?{query_string}") + + # Handle GET with calculation parameters + calculation_result = None + cleaned_calculation_result = {} + if request.args.get("anthro_height"): + try: + anthro_height = float(request.args.get("anthro_height", 0)) + species_height = float(request.args.get("species_height", 0)) + species_length = float(request.args.get("species_length", 0)) + species_tail_length = float(request.args.get("species_tail_length", 0)) + taur_full_height = float(request.args.get("taur_full_height", 0)) + species_weight = float(request.args.get("species_weight", 0)) + taur_length = request.args.get("taur_length") + measurement_type = request.args.get("measurement_type", "vitruvian") + + taur_length_float = float(taur_length) if taur_length else None + + calculation_result = calculate_taur( + anthro_height=anthro_height, + species_height=species_height, + species_length=species_length, + species_tail_length=species_tail_length, + taur_full_height=taur_full_height, + species_weight=species_weight, + taur_length=taur_length_float, + measurement_type=measurement_type, + ) - return render_template("taur.html") + cleaned_calculation_result["AR"] = f"{inches_to_feet_inches(calculation_result["AR"])} (Anthropic Ratio)" + cleaned_calculation_result["TH"] = f"{inches_to_feet_inches(calculation_result["TH"])} (Taur Height)" + cleaned_calculation_result["TFH"] = f"{inches_to_feet_inches(calculation_result["TFH"])} (Taur Full Height)" + cleaned_calculation_result["TL"] = f"{inches_to_feet_inches(calculation_result["TL"])} (Taur Length)" + cleaned_calculation_result["TT"] = f"{inches_to_feet_inches(calculation_result["TT"])} (Taur Tail Length)" + cleaned_calculation_result["TTo"] = f"{inches_to_feet_inches(calculation_result["TTo"])} (Taur Torso Length)" + cleaned_calculation_result["THe"] = f"{inches_to_feet_inches(calculation_result["THe"])} (Taur Head Length)" + cleaned_calculation_result["TW"] = f"{calculation_result["TW"]:.2f} lbs (Taur Weight)" + + except (ValueError, TypeError) as e: + logging.warning(f"Taur calculation error: {e}") + calculation_result = None + cleaned_calculation_result = None + + return render_template( + "taur.html", + species=filtered_species, + species_data=species_data_map, + calculation_result=cleaned_calculation_result, + form_data=dict(request.args) if request.args else None, + ) # For WSGI diff --git a/app/species_data/african_buffalo.yaml b/app/species_data/african_buffalo.yaml index e9dccc2..f5d44fe 100644 --- a/app/species_data/african_buffalo.yaml +++ b/app/species_data/african_buffalo.yaml @@ -1,6 +1,9 @@ male: image: "Chrissy/missing.png" ears_offset: 0 + species_length: 96 + species_tail_length: 30 + species_weight: 1500 # Pounds data: - anthro_size: 76 # 6'4" height: 60 @@ -10,6 +13,9 @@ male: female: image: "Chrissy/missing.png" ears_offset: 0 + species_length: 96 + species_tail_length: 30 + species_weight: 1500 # Pounds data: - anthro_size: 74 # 6'2" height: 54 diff --git a/app/species_data/arctic_fox.yaml b/app/species_data/arctic_fox.yaml index b2cdbc7..cc5e348 100644 --- a/app/species_data/arctic_fox.yaml +++ b/app/species_data/arctic_fox.yaml @@ -1,6 +1,9 @@ male: image: "Chrissy/randal.png" ears_offset: 4 + species_length: 28 + species_tail_length: 16 + species_weight: 12 # Pounds data: - anthro_size: 76 # 6'4" height: 22 # 22" @@ -10,6 +13,9 @@ male: female: image: "Chrissy/vixi.png" ears_offset: 4 + species_length: 28 + species_tail_length: 16 + species_weight: 12 # Pounds data: - anthro_size: 74 # 6'2" height: 20 # 22" diff --git a/app/species_data/canine.yaml b/app/species_data/canine.yaml index 0b8e618..130756a 100644 --- a/app/species_data/canine.yaml +++ b/app/species_data/canine.yaml @@ -2,6 +2,9 @@ male: image: "Hunner/Hieght_Ref_Maxene_for_Vixi.png" ears_offset: 3 color: "870716" + species_length: 36 + species_tail_length: 18 + species_weight: 80 # Pounds data: - anthro_size: 76 # 6'4" height: 28 @@ -12,6 +15,9 @@ female: image: "Hunner/Hieght_Ref_Ky-Li_for_Vixi.png" ears_offset: 9 color: "add6ed" + species_length: 36 + species_tail_length: 18 + species_weight: 80 # Pounds data: - anthro_size: 76 # 6'4" height: 26 diff --git a/app/species_data/equine.yaml b/app/species_data/equine.yaml index 6883e3a..19604c2 100644 --- a/app/species_data/equine.yaml +++ b/app/species_data/equine.yaml @@ -1,6 +1,9 @@ male: image: "Placeholder/f_equine.png" ears_offset: 0 + species_length: 72 + species_tail_length: 24 + species_weight: 1000 # Pounds data: - anthro_size: 76 # 6'4" height: 72 @@ -10,6 +13,9 @@ male: female: image: "Placeholder/f_equine.png" ears_offset: 0 + species_length: 72 + species_tail_length: 24 + species_weight: 1000 # Pounds data: - anthro_size: 76 # 6'4" height: 70 diff --git a/app/species_data/feline.yaml b/app/species_data/feline.yaml index 238de43..7c13215 100644 --- a/app/species_data/feline.yaml +++ b/app/species_data/feline.yaml @@ -2,6 +2,9 @@ male: image: "Rhainbowmetall/Felid_Sketch_Male.png" ears_offset: 9 color: "282b1d" + species_length: 30 + species_tail_length: 12 + species_weight: 15 # Pounds data: - anthro_size: 76 # 6'4" height: 14 @@ -12,6 +15,9 @@ female: image: "Rhainbowmetall/Felid_Sketch_Female.png" ears_offset: 9 color: "1d751d" + species_length: 30 + species_tail_length: 12 + species_weight: 15 # Pounds data: - anthro_size: 74 # 6'2" height: 11 diff --git a/app/species_data/fennec_fox.yaml b/app/species_data/fennec_fox.yaml index 0acb5e0..cac335a 100644 --- a/app/species_data/fennec_fox.yaml +++ b/app/species_data/fennec_fox.yaml @@ -1,6 +1,9 @@ male: image: "Chrissy/m_fennec.png" ears_offset: 10 + species_length: 20 + species_tail_length: 15 + species_weight: 3 # Pounds data: - anthro_size: 76 # 6'4" height: 11 @@ -10,6 +13,9 @@ male: female: image: "Chrissy/missing.png" ears_offset: 0 + species_length: 20 + species_tail_length: 14 + species_weight: 3 # Pounds data: - anthro_size: 74 # 6'2" height: 10 diff --git a/app/species_data/giraffe.yaml b/app/species_data/giraffe.yaml index ff95520..d5f59be 100644 --- a/app/species_data/giraffe.yaml +++ b/app/species_data/giraffe.yaml @@ -1,6 +1,9 @@ male: image: "Placeholder/m_giraffe.png" ears_offset: 0 + species_length: 120 + species_tail_length: 36 + species_weight: 3000 # Pounds data: - anthro_size: 76 # 6'4" height: 220 @@ -10,6 +13,9 @@ male: female: image: "Placeholder/m_giraffe.png" ears_offset: 0 + species_length: 120 + species_tail_length: 36 + species_weight: 2600 # Pounds data: - anthro_size: 76 # 6'4" height: 200 diff --git a/app/species_data/mouse.yaml b/app/species_data/mouse.yaml index bc8f116..1e1cca6 100644 --- a/app/species_data/mouse.yaml +++ b/app/species_data/mouse.yaml @@ -2,6 +2,9 @@ male: image: "Hunner/Size_Refs_Mouse_for_Vixi (male).png" ears_offset: 6 color: "007516" + species_length: 4 + species_tail_length: 3 + species_weight: 0.5 # Pounds data: - anthro_size: 76 # 6'4" height: 3 @@ -12,6 +15,9 @@ female: image: "Hunner/Size_Refs_Mouse_for_Vixi (female).png" ears_offset: 7 color: "7900ad" + species_length: 4 + species_tail_length: 3 + species_weight: 0.5 # Pounds data: - anthro_size: 74 # 6'2" height: 2.5 diff --git a/app/species_data/red_fox.yaml b/app/species_data/red_fox.yaml index afe5cec..db3fe8a 100644 --- a/app/species_data/red_fox.yaml +++ b/app/species_data/red_fox.yaml @@ -1,6 +1,9 @@ male: image: "Chrissy/randal.png" ears_offset: 4 + species_length: 28 + species_tail_length: 16 + species_weight: 12 # Pounds data: - anthro_size: 76 # 6'4" height: 17 @@ -10,6 +13,9 @@ male: female: image: "Chrissy/sinopa.png" ears_offset: 1.5 + species_length: 28 + species_tail_length: 16 + species_weight: 12 # Pounds data: - anthro_size: 76 # 6'4" height: 15 diff --git a/app/species_data/saber-toothed_tiger.yaml b/app/species_data/saber-toothed_tiger.yaml index 62dc89c..821a244 100644 --- a/app/species_data/saber-toothed_tiger.yaml +++ b/app/species_data/saber-toothed_tiger.yaml @@ -2,6 +2,9 @@ male: image: "Hunner/Hieght_Ref_NO_BAK_Tirga_for_Tirga.png" ears_offset: 3 color: "00730b" + species_length: 60 + species_tail_length: 30 + species_weight: 400 # Pounds data: - anthro_size: 76 # 6'4" height: 44 @@ -12,6 +15,9 @@ female: image: "Hunner/Hieght_Ref_NO_BAK_Tirga_for_Tirga.png" ears_offset: 3 color: "b216f0" + species_length: 60 + species_tail_length: 30 + species_weight: 400 # Pounds data: - anthro_size: 74 # 6'2" height: 46 diff --git a/app/species_data/shark.yaml b/app/species_data/shark.yaml index 0d2f8b7..bafa677 100644 --- a/app/species_data/shark.yaml +++ b/app/species_data/shark.yaml @@ -3,6 +3,9 @@ male: image: "Mori/m_shark.png" ears_offset: 3 # color: "311b9e" + species_length: 72 + species_tail_length: 36 + species_weight: 500 # Pounds data: - anthro_size: 76 # 6'4" height: 90 @@ -13,6 +16,9 @@ female: image: "Mori/f_shark.png" ears_offset: 3 # color: "664ce6" + species_length: 72 + species_tail_length: 36 + species_weight: 500 # Pounds data: - anthro_size: 74 # 6'2" height: 92 diff --git a/app/species_data/wolf.yaml b/app/species_data/wolf.yaml index 3dcb731..f9de2b2 100644 --- a/app/species_data/wolf.yaml +++ b/app/species_data/wolf.yaml @@ -1,6 +1,9 @@ male: image: "Placeholder/m_wolf.png" ears_offset: 0 + species_length: 40 + species_tail_length: 20 + species_weight: 100 # Pounds data: - anthro_size: 76 # 6'4" height: 36 @@ -10,6 +13,9 @@ male: female: image: "Hunner/Hieght_Ref_Ky-Li_for_Vixi.png" ears_offset: 10 + species_length: 40 + species_tail_length: 20 + species_weight: 100 # Pounds data: - anthro_size: 76 # 6'4" height: 34 diff --git a/app/static/css/taur_app.css b/app/static/css/taur_app.css new file mode 100644 index 0000000..73ea6be --- /dev/null +++ b/app/static/css/taur_app.css @@ -0,0 +1,150 @@ +.taur-container { + max-width: 1400px; + margin: 20px auto; + padding: 20px; + display: grid; + grid-template-columns: 1fr 400px; + gap: 30px; + min-height: calc(100vh - 40px); +} + +.taur-left-column { + display: flex; + align-items: center; + justify-content: center; + height: 100vh; + max-height: 100vh; +} + +.taur-right-column { + display: flex; + flex-direction: column; + gap: 20px; +} + +.taur-header { + text-align: center; +} + +.taur-header h1 { + color: #f80; + font-size: 2.5em; + margin-bottom: 10px; +} + +.taur-header p { + color: #fff; + font-size: 1.1em; +} + +.taur-canvas-container { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +#taur-canvas { + border: 2px solid #f80; + border-radius: 8px; + background: #000; + max-width: 50vw; + max-height: 100vh; + width: auto; + height: auto; +} + +.taur-form { + display: flex; + flex-direction: column; + gap: 15px; +} + +.taur-form-group { + display: flex; + flex-direction: column; +} + +.taur-form-group label { + color: #fff; + margin-bottom: 5px; + font-size: 1em; +} + +.info-icon { + cursor: help; + font-size: 0.9em; + opacity: 0.7; + margin-left: 4px; + display: inline-block; + vertical-align: middle; +} + +.info-icon:hover { + opacity: 1; +} + +.taur-form-group input, +.taur-form-group select { + padding: 10px; + font-size: 1em; + border: 1px solid #444; + border-radius: 5px; + background: #222; + color: #fff; + width: 100%; + box-sizing: border-box; +} + +.taur-form-group input:focus, +.taur-form-group select:focus { + outline: none; + border-color: #f80; +} + +.taur-form button { + padding: 10px 20px; + font-size: 1em; + background: #f80; + color: #000; + border: none; + border-radius: 5px; + cursor: pointer; + font-weight: bold; +} + +.taur-form button:hover { + background: #ffab40; +} + +.back-link-container { + text-align: center; +} + +.back-link { + color: #78d0ff; + text-decoration: none; + font-size: 1.2em; +} + +.back-link:hover { + color: #a0e0ff; +} + +@media (max-width: 968px) { + .taur-container { + grid-template-columns: 1fr; + } + + .taur-left-column { + order: -1; + height: auto; + min-height: 300px; + } + + #taur-canvas { + max-width: 100vw; + max-height: 50vh; + } +} diff --git a/app/static/images/taur/TaurCalculatorReference.png b/app/static/images/taur/TaurCalculatorReference.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef1e1ff5e66af75bd939b89f7963930a2ac8833 GIT binary patch literal 43238 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 - Taur Calculator (Coming Soon!) + Taur Calculator + -
-

Taur Calculator

-

Thanks to Volnar this feature is coming soon! - You'll be able to size your taur-self up!

-
- ← Back - to Main Calculator +
+
+
+ +
+
+
+
+

Taur Calculator

+

By Vixi and Volnar!

+
+ + + + + + {% if calculation_result %} +
+

Calculation Results

+
+ + + {% for key, value in calculation_result.items() %} + + + + + {% endfor %} + +
{{ key }} + + {% if value is string %} + {{ value.replace('\\u0027', "'") }} + {% elif value is mapping %} + { } + {% else %} + {{ value }} + {% endif %} +
+
+
+ {% endif %} + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/app/utils/taur_calculator.py b/app/utils/taur_calculator.py new file mode 100644 index 0000000..a1a70a0 --- /dev/null +++ b/app/utils/taur_calculator.py @@ -0,0 +1,98 @@ +# Conceived by Volnar <3 +# Implemented by Vixi! + +from typing import Dict, Any, Tuple, Optional + + +def calculate_taur( + anthro_height: float, + species_height: float, + species_length: float, + species_tail_length: float, + taur_full_height: float, + species_weight: float, + taur_length: Optional[float] = None, + measurement_type: str = "limb", # "limb" for mammals, "vitruvian" for reptiles + custom_body_parts: Optional[Dict[str, float]] = None, +) -> Dict[str, Any]: + """ + Calculate taur body dimensions based on provided inputs + using Volnar's Taur Calculator formula <3 + + Args: + anthro_height (float): Anthro height before taurification (AH). + species_height (float): Species height (SH). + species_length (float): Species length w/o tail (SL). + species_tail_length (float): Species tail length (ST). + taur_full_height (float): Taur full height (TFH). + species_weight (float): Species weight (SW). + taur_length (float, optional): Taur length w/o tail (TL). + measurement_type (str, optional): 'limb' (default) or 'vitruvian'. + custom_body_parts (dict, optional): Additional custom body part measurements (CBP). + + Returns: + Dict[str, Any]: Calculated taur results including TH, TFH, TL, etc. + """ + + # Splitting Anthro Height into parts + anthro_legs = anthro_height * 4 / 8 + anthro_torso = anthro_height * 3 / 8 + anthro_head = anthro_height * 1 / 8 + # Here approx: arm_length = anthro_legs + + # TH: Taur Height + if measurement_type == "limb": + # Limb Type: TH = AL + taur_height = anthro_legs + if taur_length is None: + taur_length_calc = species_length + else: + taur_length_calc = taur_length + else: + # Vitruvian Type: TL = (2 * AT) - AHe + taur_length_calc = (2 * anthro_torso) - anthro_head + # In this type, TH meaning is not directly defined; fallback to species scaling + taur_height = species_height * (taur_full_height / anthro_height) + + # Ratios + # TR: Taur Ratio (size change between SH and TH) + taur_ratio = taur_height / species_height if species_height > 0 else 0 + # AR: Anthro Ratio (size change between AH and TFH) + anthro_ratio = taur_full_height / anthro_height if anthro_height > 0 else 0 + + # Apply AR to custom body parts + cbp_result = {} + if custom_body_parts: + for part, value in custom_body_parts.items(): + cbp_result[part] = value * anthro_ratio + + # Taur Torso and Head + taur_torso = anthro_torso * anthro_ratio + taur_head = anthro_head * anthro_ratio + + # Taur Tail + taur_tail = ( + species_tail_length * taur_ratio if species_tail_length is not None else 0 + ) + + # Taur Weight estimate: cube AR, apply to SW + taur_weight = species_weight * (anthro_ratio**3) + taur_weight_minus = taur_weight * 0.9 + taur_weight_plus = taur_weight * 1.1 + + # Compose results + result = { + "TH": taur_height, + "TFH": taur_full_height, + "TL": taur_length_calc, + "TT": taur_tail, + "TTo": taur_torso, + "THe": taur_head, + "TW": taur_weight, + "TW-": taur_weight_minus, + "TW+": taur_weight_plus, + "CBP": cbp_result, + "AR": anthro_ratio, + "TR": taur_ratio, + } + return result From e8fed0631e2f5edc89c5eedffffe190f2fc78b79 Mon Sep 17 00:00:00 2001 From: Snowsune Date: Fri, 2 Jan 2026 19:22:47 -0500 Subject: [PATCH 2/3] Format with black --- app/__init__.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 65e92de..b549616 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -395,14 +395,30 @@ def taur(): measurement_type=measurement_type, ) - cleaned_calculation_result["AR"] = f"{inches_to_feet_inches(calculation_result["AR"])} (Anthropic Ratio)" - cleaned_calculation_result["TH"] = f"{inches_to_feet_inches(calculation_result["TH"])} (Taur Height)" - cleaned_calculation_result["TFH"] = f"{inches_to_feet_inches(calculation_result["TFH"])} (Taur Full Height)" - cleaned_calculation_result["TL"] = f"{inches_to_feet_inches(calculation_result["TL"])} (Taur Length)" - cleaned_calculation_result["TT"] = f"{inches_to_feet_inches(calculation_result["TT"])} (Taur Tail Length)" - cleaned_calculation_result["TTo"] = f"{inches_to_feet_inches(calculation_result["TTo"])} (Taur Torso Length)" - cleaned_calculation_result["THe"] = f"{inches_to_feet_inches(calculation_result["THe"])} (Taur Head Length)" - cleaned_calculation_result["TW"] = f"{calculation_result["TW"]:.2f} lbs (Taur Weight)" + cleaned_calculation_result["AR"] = ( + f"{inches_to_feet_inches(calculation_result["AR"])} (Anthropic Ratio)" + ) + cleaned_calculation_result["TH"] = ( + f"{inches_to_feet_inches(calculation_result["TH"])} (Taur Height)" + ) + cleaned_calculation_result["TFH"] = ( + f"{inches_to_feet_inches(calculation_result["TFH"])} (Taur Full Height)" + ) + cleaned_calculation_result["TL"] = ( + f"{inches_to_feet_inches(calculation_result["TL"])} (Taur Length)" + ) + cleaned_calculation_result["TT"] = ( + f"{inches_to_feet_inches(calculation_result["TT"])} (Taur Tail Length)" + ) + cleaned_calculation_result["TTo"] = ( + f"{inches_to_feet_inches(calculation_result["TTo"])} (Taur Torso Length)" + ) + cleaned_calculation_result["THe"] = ( + f"{inches_to_feet_inches(calculation_result["THe"])} (Taur Head Length)" + ) + cleaned_calculation_result["TW"] = ( + f"{calculation_result["TW"]:.2f} lbs (Taur Weight)" + ) except (ValueError, TypeError) as e: logging.warning(f"Taur calculation error: {e}") From e76c86f08e60ac9740ff529309c179af8a9512ab Mon Sep 17 00:00:00 2001 From: Snowsune Date: Fri, 2 Jan 2026 19:25:22 -0500 Subject: [PATCH 3/3] Fix.. again :P --- app/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index b549616..ad8b838 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -396,28 +396,28 @@ def taur(): ) cleaned_calculation_result["AR"] = ( - f"{inches_to_feet_inches(calculation_result["AR"])} (Anthropic Ratio)" + f"{inches_to_feet_inches(calculation_result['AR'])} (Anthropic Ratio)" ) cleaned_calculation_result["TH"] = ( - f"{inches_to_feet_inches(calculation_result["TH"])} (Taur Height)" + f"{inches_to_feet_inches(calculation_result['TH'])} (Taur Height)" ) cleaned_calculation_result["TFH"] = ( - f"{inches_to_feet_inches(calculation_result["TFH"])} (Taur Full Height)" + f"{inches_to_feet_inches(calculation_result['TFH'])} (Taur Full Height)" ) cleaned_calculation_result["TL"] = ( - f"{inches_to_feet_inches(calculation_result["TL"])} (Taur Length)" + f"{inches_to_feet_inches(calculation_result['TL'])} (Taur Length)" ) cleaned_calculation_result["TT"] = ( - f"{inches_to_feet_inches(calculation_result["TT"])} (Taur Tail Length)" + f"{inches_to_feet_inches(calculation_result['TT'])} (Taur Tail Length)" ) cleaned_calculation_result["TTo"] = ( - f"{inches_to_feet_inches(calculation_result["TTo"])} (Taur Torso Length)" + f"{inches_to_feet_inches(calculation_result['TTo'])} (Taur Torso Length)" ) cleaned_calculation_result["THe"] = ( - f"{inches_to_feet_inches(calculation_result["THe"])} (Taur Head Length)" + f"{inches_to_feet_inches(calculation_result['THe'])} (Taur Head Length)" ) cleaned_calculation_result["TW"] = ( - f"{calculation_result["TW"]:.2f} lbs (Taur Weight)" + f"{calculation_result['TW']:.2f} lbs (Taur Weight)" ) except (ValueError, TypeError) as e: