docs: def is_opening_code_fence(line: str, parser: str = 'github'):
      r"""Determine if the given line is possibly the opening of a fenced code block.
  
      :parameter line: a single markdown line to evaluate.
      :parameter parser: decides rules on how to generate the anchor text.
           Defaults to ``github``.
      :type line: str
      :type parser: str
      :returns: None if the input line is not an opening code fence. Otherwise,
           returns the string which will identify the closing code fence
           according to the input parsers' rules.
      :rtype: typing.Optional[str]
      :raises: a built-in exception.
      """
      if (parser == 'github' or parser == 'cmark' or parser == 'gitlab'
              or parser == 'commonmarker'):
          markers = md_parser['github']['code fence']['marker']
          marker_min_length = md_parser['github']['code fence'][
              'min_marker_characters']
  
          if not is_valid_code_fence_indent(line):
              return None
  
          line = line.lstrip(' ').rstrip('\n')
          if not line.startswith(
              (markers[0] * marker_min_length, markers[1] * marker_min_length)):
              return None
  
          if line == len(line) * line[0]:
              info_string = str()
          else:
              info_string = line.lstrip(line[0])
          # Backticks or tildes in info string are explicitly forbidden.
          if markers[0] in info_string or markers[1] in info_string:
              return None
          # Solves example 107. See:
          # https://github.github.com/gfm/#example-107
          if line.rstrip(markers[0]) != line and line.rstrip(markers[1]) != line:
              return None
  
          return line.rstrip(info_string)
      elif parser == 'redcarpet':
          # TODO.
          return None