code: def substitute(self, target, replacement):
          
          # Find the target in the parent selector, and split it into
          # before/after
          p_before, p_extras, p_after = self.break_around(target.simple_selectors)
  
          # The replacement has no hinge; it only has the most specific simple
          # selector (which is the part that replaces "self" in the parent) and
          # whatever preceding simple selectors there may be
          r_trail = replacement.simple_selectors[:-1]
          r_extras = replacement.simple_selectors[-1]
  
          # TODO what if the prefix doesn't match?  who wins?  should we even get
          # this far?
          focal_nodes = (p_extras.merge_into(r_extras),)
  
          befores = _merge_selectors(p_before, r_trail)
  
          cls = type(self)
          return [
              cls(before + focal_nodes + p_after)
              for before in befores]
docs: Return a list of selectors obtained by replacing the `target`
          selector with `replacement`.
  
          Herein lie the guts of the Sass @extend directive.
  
          In general, for a selector ``a X b Y c``, a target ``X Y``, and a
          replacement ``q Z``, return the selectors ``a q X b Z c`` and ``q a X b
          Z c``.  Note in particular that no more than two selectors will be
          returned, and the permutation of ancestors will never insert new simple
          selectors "inside" the target selector.