'Derived from the NumpyDoc implementation of _parse_see_also.
See Also
func_name : Descriptive text
continued text
another_func_name : Descriptive text
func_name1, func_name2, :meth:`func_name`, func_name3'

def _parse_numpydoc_see_also_section(self, content):

    items = []
    def parse_item_name(text):
        "Match    ':role:`name`'    or    'name'"
        m = self._name_rgx.match(text)
        if m:
            g = m.groups()
            if (g[1] is None):
                return (g[3], None)
            else:
                return (g[2], g[1])
        raise ValueError(('%s    is    not    a    item    name' % text))
    def push_item(name, rest):
        if (not name):
            return
        (name, role) = parse_item_name(name)
        items.append((name, list(rest), role))
        del rest[:]
    current_func = None
    rest = []
    for line in content:
        if (not line.strip()):
            continue
        m = self._name_rgx.match(line)
        if (m and line[m.end():].strip().startswith(':')):
            push_item(current_func, rest)
            (current_func, line) = (line[:m.end()], line[m.end():])
            rest = [line.split(':', 1)[1].strip()]
            if (not rest[0]):
                rest = []
        elif (not line.startswith('    ')):
            push_item(current_func, rest)
            current_func = None
            if (',' in line):
                for func in line.split(','):
                    if func.strip():
                        push_item(func, [])
            elif line.strip():
                current_func = line
        elif (current_func is not None):
            rest.append(line.strip())
    push_item(current_func, rest)
    if (not items):
        return []
    roles = {'method': 'meth', 'meth': 'meth', 'function': 'func', 'func': 'func', 'class': 'class', 'exception': 'exc', 'exc': 'exc', 'object': 'obj', 'obj': 'obj', 'module': 'mod', 'mod': 'mod', 'data': 'data', 'constant': 'const', 'const': 'const', 'attribute': 'attr', 'attr': 'attr'}
    if (self._what is None):
        func_role = 'obj'
    else:
        func_role = roles.get(self._what, '')
    lines = []
    last_had_desc = True
    for (func, desc, role) in items:
        if role:
            link = (':%s:`%s`' % (role, func))
        elif func_role:
            link = (':%s:`%s`' % (func_role, func))
        else:
            link = ('`%s`_' % func)
        if (desc or last_had_desc):
            lines += ['']
            lines += [link]
        else:
            lines[(-1)] += (',    %s' % link)
        if desc:
            lines += self._indent(['    '.join(desc)])
            last_had_desc = True
        else:
            last_had_desc = False
    lines += ['']
    return self._format_admonition('seealso', lines)
