code: def format_and_strip(template, params, strip_string=strip_string):
      
      chunks = template.split(u"%s")
      if not chunks:
          raise ValueError("No formatting placeholders found")
  
      params = list(reversed(params))
      rv_remarks = []
      rv_original_length = 0
      rv_length = 0
      rv = []
  
      def realign_remark(remark):
          return [
              (rv_length + x if isinstance(x, int_types) and i < 4 else x)
              for i, x in enumerate(remark)
          ]
  
      for chunk in chunks[:-1]:
          rv.append(chunk)
          rv_length += len(chunk)
          rv_original_length += len(chunk)
          if not params:
              raise ValueError("Not enough params.")
          param = params.pop()
  
          stripped_param = strip_string(param)
          if isinstance(stripped_param, AnnotatedValue):
              rv_remarks.extend(
                  realign_remark(remark) for remark in stripped_param.metadata["rem"]
              )
              stripped_param = stripped_param.value
  
          rv_original_length += len(param)
          rv_length += len(stripped_param)
          rv.append(stripped_param)
  
      rv.append(chunks[-1])
      rv_length += len(chunks[-1])
      rv_original_length += len(chunks[-1])
  
      rv = u"".join(rv)
      assert len(rv) == rv_length
  
      if not rv_remarks:
          return rv
  
      return AnnotatedValue(
          value=rv, metadata={"len": rv_original_length, "rem": rv_remarks}
      )
docs: Format a string containing %s for placeholders and call `strip_string`
      on each parameter. The string template itself does not have a maximum
      length.
  
      TODO: handle other placeholders, not just %s