docs: def insert_before(self, obj, value, recursive=True):
          """Insert *value* immediately before *obj*.
  
          *obj* can be either a string, a :class:`.Node`, or another
          :class:`.Wikicode` object (as created by :meth:`get_sections`, for
          example). If *obj* is a string, we will operate on all instances of
          that string within the code, otherwise only on the specific instance
          given. *value* can be anything parsable by :func:`.parse_anything`. If
          *recursive* is ``True``, we will try to find *obj* within our child
          nodes even if it is not a direct descendant of this :class:`.Wikicode`
          object. If *obj* is not found, :exc:`ValueError` is raised.
          """
          if isinstance(obj, (Node, Wikicode)):
              context, index = self._do_strong_search(obj, recursive)
              context.insert(index.start, value)
          else:
              for exact, context, index in self._do_weak_search(obj, recursive):
                  if exact:
                      context.insert(index.start, value)
                  else:
                      obj = str(obj)
                      self._slice_replace(context, index, obj, str(value) + obj)