summaryrefslogtreecommitdiff
path: root/scss/cssdefs.py
diff options
context:
space:
mode:
authorEevee (Lexy Munroe) <eevee.git@veekun.com>2016-06-08 18:43:11 -0700
committerEevee (Lexy Munroe) <eevee.git@veekun.com>2016-06-08 18:43:11 -0700
commit9ea91782b4b4dacc144454db14c32e9302e9347b (patch)
treed5eef8f47153aeba3ce3c077829b946203917ac9 /scss/cssdefs.py
parent8ded7bef22819a080299a3b0dd32fd08b8dbdff7 (diff)
downloadpyscss-9ea91782b4b4dacc144454db14c32e9302e9347b.tar.gz
Avoid precision loss when converting between units. Fixes #330
Diffstat (limited to 'scss/cssdefs.py')
-rw-r--r--scss/cssdefs.py19
1 files changed, 10 insertions, 9 deletions
diff --git a/scss/cssdefs.py b/scss/cssdefs.py
index 5d9b7eb..79be7b4 100644
--- a/scss/cssdefs.py
+++ b/scss/cssdefs.py
@@ -1,6 +1,7 @@
"""Constants and functions defined by the CSS specification, not specific to
Sass.
"""
+from fractions import Fraction
from math import pi
import re
@@ -166,15 +167,15 @@ BASE_UNIT_CONVERSIONS = {
# Lengths
'mm': (1, 'mm'),
'cm': (10, 'mm'),
- 'in': (25.4, 'mm'),
- 'px': (25.4 / 96, 'mm'),
- 'pt': (25.4 / 72, 'mm'),
- 'pc': (25.4 / 6, 'mm'),
+ 'in': (Fraction(254, 10), 'mm'),
+ 'px': (Fraction(254, 960), 'mm'),
+ 'pt': (Fraction(254, 720), 'mm'),
+ 'pc': (Fraction(254, 60), 'mm'),
# Angles
- 'deg': (1 / 360, 'turn'),
- 'grad': (1 / 400, 'turn'),
- 'rad': (pi / 2, 'turn'),
+ 'deg': (Fraction(1, 360), 'turn'),
+ 'grad': (Fraction(1, 400), 'turn'),
+ 'rad': (Fraction.from_float(pi / 2), 'turn'),
'turn': (1, 'turn'),
# Times
@@ -187,7 +188,7 @@ BASE_UNIT_CONVERSIONS = {
# Resolutions
'dpi': (1, 'dpi'),
- 'dpcm': (2.54, 'dpi'),
+ 'dpcm': (Fraction(254 / 100), 'dpi'),
'dppx': (96, 'dpi'),
}
@@ -252,7 +253,7 @@ def cancel_base_units(units, to_remove):
# Copy the dict since we're about to mutate it
to_remove = to_remove.copy()
remaining_units = []
- total_factor = 1
+ total_factor = Fraction(1)
for unit in units:
factor, base_unit = get_conversion_factor(unit)