docs: def parse_region(self):
          """Parse the region component of the path.
  
          /full/ -> self.region_full = True (test this first)
          /square/ -> self.region_square = True (test this second)
          /x,y,w,h/ -> self.region_xywh = (x,y,w,h)
          /pct:x,y,w,h/ -> self.region_xywh and self.region_pct = True
  
          Will throw errors if the parameters are illegal according to the
          specification but does not know about and thus cannot do any tests
          against any image being manipulated.
          """
          self.region_full = False
          self.region_square = False
          self.region_pct = False
          if (self.region is None or self.region == 'full'):
              self.region_full = True
              return
          if (self.api_version >= '2.1' and self.region == 'square'):
              self.region_square = True
              return
          xywh = self.region
          pct_match = re.match('pct:(.*)$', self.region)
          if (pct_match):
              xywh = pct_match.group(1)
              self.region_pct = True
          # Now whether this was pct: or now, we expect 4 values...
          str_values = xywh.split(',', 5)
          if (len(str_values) != 4):
              raise IIIFRequestError(
                  code=400, parameter="region",
                  text="Bad number of values in region specification, "
                       "must be x,y,w,h but got %d value(s) from '%s'" %
                       (len(str_values), xywh))
          values = []
          for str_value in str_values:
              # Must be either integer (not pct) or interger/float (pct)
              if (pct_match):
                  try:
                      # This is rather more permissive that the iiif spec
                      value = float(str_value)
                  except ValueError:
                      raise IIIFRequestError(
                          parameter="region",
                          text="Bad floating point value for percentage in "
                               "region (%s)." % str_value)
                  if (value > 100.0):
                      raise IIIFRequestError(
                          parameter="region",
                          text="Percentage over value over 100.0 in region "
                               "(%s)." % str_value)
              else:
                  try:
                      value = int(str_value)
                  except ValueError:
                      raise IIIFRequestError(
                          parameter="region",
                          text="Bad integer value in region (%s)." % str_value)
              if (value < 0):
                  raise IIIFRequestError(
                      parameter="region",
                      text="Negative values not allowed in region (%s)." %
                      str_value)
              values.append(value)
          # Zero size region is w or h are zero (careful that they may be float)
          if (values[2] == 0.0 or values[3] == 0.0):
              raise IIIFZeroSizeError(
                  code=400, parameter="region",
                  text="Zero size region specified (%s))." % xywh)
          self.region_xywh = values