docs: def object_to_markdownpage(obj_name, obj, s=''):
      """Generate the markdown documentation of a Python object.
  
      Parameters
      ----------
      obj_name : str
          Name of the Python object.
      obj : object
          Python object (class, method, function, ...)
      s : str (default: '')
          A string to which the documentation will be appended to.
  
      Returns
      ---------
      s : str
          The markdown page.
  
      """
      # header
      s += '## %s\n' % obj_name
  
      # function/class/method signature
      sig = str(inspect.signature(obj)).replace('(self, ', '(')
      s += '\n*%s%s*\n\n' % (obj_name, sig)
  
      # docstring body
      doc = str(inspect.getdoc(obj))
      ds = docstring_to_markdown(doc)
      s += '\n'.join(ds)
  
      # document methods
      if inspect.isclass(obj):
          methods, properties = '\n\n### Methods', '\n\n### Properties'
          members = inspect.getmembers(obj)
          for m in members:
              if not m[0].startswith('_') and len(m) >= 2:
                  if isinstance(m[1], property):
                      properties += '\n\n<hr>\n\n*%s*\n\n' % m[0]
                      m_doc = docstring_to_markdown(str(inspect.getdoc(m[1])))
                      properties += '\n'.join(m_doc)
                  else:
                      sig = str(inspect.signature(m[1]))
                      sig = sig.replace('(self, ', '(').replace('(self)', '()')
                      sig = sig.replace('(self)', '()')
                      methods += '\n\n<hr>\n\n*%s%s*\n\n' % (m[0], sig)
                      m_doc = docstring_to_markdown(str(inspect.getdoc(m[1])))
                      methods += '\n'.join(m_doc)
          s += methods
          s += properties
      return s + '\n\n'