docs: def getSize(value, relative=0, base=None, default=0.0):
      """
      Converts strings to standard sizes.
      That is the function taking a string of CSS size ('12pt', '1cm' and so on)
      and converts it into a float in a standard unit (in our case, points).
  
      >>> getSize('12pt')
      12.0
      >>> getSize('1cm')
      28.346456692913385
      """
      try:
          original = value
          if value is None:
              return relative
          elif type(value) is float:
              return value
          elif isinstance(value, int):
              return float(value)
          elif type(value) in (tuple, list):
              value = "".join(value)
          value = str(value).strip().lower().replace(",", ".")
          if value[-2:] == 'cm':
              return float(value[:-2].strip()) * cm
          elif value[-2:] == 'mm':
              return float(value[:-2].strip()) * mm  # 1mm = 0.1cm
          elif value[-2:] == 'in':
              return float(value[:-2].strip()) * inch  # 1pt == 1/72inch
          elif value[-2:] == 'inch':
              return float(value[:-4].strip()) * inch  # 1pt == 1/72inch
          elif value[-2:] == 'pt':
              return float(value[:-2].strip())
          elif value[-2:] == 'pc':
              return float(value[:-2].strip()) * 12.0  # 1pc == 12pt
          elif value[-2:] == 'px':
              # XXX W3C says, use 96pdi
              # http://www.w3.org/TR/CSS21/syndata.html#length-units
              return float(value[:-2].strip()) * dpi96
          elif value[-1:] == 'i':  # 1pt == 1/72inch
              return float(value[:-1].strip()) * inch
          elif value in ("none", "0", "auto"):
              return 0.0
          elif relative:
              if value[-2:] == 'em':  # XXX
                  # 1em = 1 * fontSize
                  return float(value[:-2].strip()) * relative
              elif value[-2:] == 'ex':  # XXX
                  # 1ex = 1/2 fontSize
                  return float(value[:-2].strip()) * (relative / 2.0)
              elif value[-1:] == '%':
                  # 1% = (fontSize * 1) / 100
                  return (relative * float(value[:-1].strip())) / 100.0
              elif value in ("normal", "inherit"):
                  return relative
              elif value in _relativeSizeTable:
                  if base:
                      return max(MIN_FONT_SIZE, base * _relativeSizeTable[value])
                  return max(MIN_FONT_SIZE, relative * _relativeSizeTable[value])
              elif value in _absoluteSizeTable:
                  if base:
                      return max(MIN_FONT_SIZE, base * _absoluteSizeTable[value])
                  return max(MIN_FONT_SIZE, relative * _absoluteSizeTable[value])
              else:
                  return max(MIN_FONT_SIZE, relative * float(value))
          try:
              value = float(value)
          except ValueError:
              log.warn("getSize: Not a float %r", value)
              return default  # value = 0
          return max(0, value)
      except Exception:
          log.warn("getSize %r %r", original, relative, exc_info=1)
          return default