Reports available data types

    Args:
        editor_quote: character to enclose the name of the editor script between.
        flag_leaf: see tabulate_filetypes_rest()

    Returns:
        list: list of FileTypeInfo

def get_filetypes_info(editor_quote="`", flag_leaf=True):
    """
    Reports available data types

    Args:
        editor_quote: character to enclose the name of the editor script between.
        flag_leaf: see tabulate_filetypes_rest()

    Returns:
        list: list of FileTypeInfo
    """
    NONE_REPL = ""
    import f311
    data = []  # [FileTypeInfo, ...]

    for attr in f311.classes_file(flag_leaf):
        description = a99.get_obj_doc0(attr)

        def_ = NONE_REPL if attr.default_filename is None else attr.default_filename
        ee = attr.editors
        if ee is None:
            ee = NONE_REPL
        else:
            # Example: "``mained.py``, ``x.py``"
            ee = ", ".join(["{0}{1}{0}".format(editor_quote, x, editor_quote) for x in ee])

        data.append({"description": description, "default_filename": def_, "classname": attr.__name__,
                     "editors": ee, "class": attr, "txtbin": "text" if attr.flag_txt else "binary"})

    data.sort(key=lambda x: x["description"])

    return data