def get_project_link_objs():
    """Return custom list with link objects.

    That is, objects whose surfaces represent web links.
    """
    project_link_objs = List2D()

    ### create list of icon surfaces

    surfaces = [
        (
            render_layered_icon(
                chars=[chr(ordinal) for ordinal in (183, 184, 185)],
                dimension_name="width",
                dimension_value=28,
                colors=[BLACK, WHITE, (77, 77, 105)],
                background_width=30,
                background_height=30,
            )
        ),
        (IMAGE_SURFS_DB["github_mark.png"][{"use_alpha": True}]),
        (IMAGE_SURFS_DB["github_mark.png"][{"use_alpha": True}]),
        NODES_GALLERY_ICON,
        (IMAGE_SURFS_DB["indie_smiths_logo.png"][{"use_alpha": True}]),
        (IMAGE_SURFS_DB["kennedy_logo.png"][{"use_alpha": True}]),
        (IMAGE_SURFS_DB["bluesky_logo.png"][{"use_alpha": True}]),
        (IMAGE_SURFS_DB["discord_logo.png"][{"use_alpha": True}]),
        (IMAGE_SURFS_DB["patreon_logo.png"][{"use_alpha": True}]),
        WEB_ICON,
    ]

    ### obtain a list with their rects
    rects = [surf.get_rect() for surf in surfaces]

    ### use a rects manager to position their rects relative
    ### to each other

    rectsman = RectsManager(rects.__iter__)

    rectsman.snap_rects_ip(
        retrieve_pos_from="bottomleft",
        assign_pos_to="topleft",
        offset_pos_by=(0, 5),
    )

    ### store the rectsman right, slightly offset to the
    ### right
    right = rectsman.move(10, 0).right

    ### define data to create link objects;
    ### that is, icon, label text and url for each link

    project_links_data = (
        (
            t.splash_screen.application_website,
            t.splash_screen.application_website_url,
        ),
        (
            "Source code",
            "https://github.com/IndieSmiths/nodezator",
        ),
        (
            "Discussions/forum",
            "https://github.com/IndieSmiths/nodezator/discussions",
        ),
        (
            "Find, download, publish nodes",
            "https://gallery.nodezator.com",
        ),
        (
            t.splash_screen.parent_project_website,
            t.splash_screen.parent_project_website_url,
        ),
        (
            t.splash_screen.developer_website,
            t.splash_screen.developer_website_url,
        ),
        (
            t.splash_screen.developer_links_social,
            "https://kennedyrichard.com/links",
        ),
        (
            "Join us on discord",
            "https://indiesmiths.com/discord",
        ),
        (
            "Support us on patreon",
            "https://patreon.com/KennedyRichard",
        ),
        (
            "Other support options",
            "https://indiesmiths.com/donate",
        ),
    )

    ### iterate over the surfaces, recs and link data,
    ### creating the link objects

    for icon, rect, (text, url) in zip(surfaces, rects, project_links_data):

        ### create text surface

        text_surf = render_text(text=text, **TEXT_SETTINGS)

        ### obtain a rect for the text surface and position
        ### it relative to icon rect and the rectsman right
        ### we obtained

        text_rect = text_surf.get_rect()
        text_rect.midleft = (right, rect.centery)

        ### finally obtain an union of the text and icon
        ### surfaces

        final_surf = unite_surfaces(
            [(icon, rect), (text_surf, text_rect)],
            padding=3,
            background_color=SPLASH_BG,
        )

        ### create object

        link_obj = Object2D.from_surface(
            surface=final_surf,
            on_mouse_release=(get_oblivious_callable(partial(open_url, url))),
            href=url,
        )

        ### store the link object
        project_link_objs.append(link_obj)

    ### position link objects relative to each other

    project_link_objs.rect.snap_rects_ip(
        retrieve_pos_from="bottomleft",
        assign_pos_to="topleft",
        offset_pos_by=(0, 3),
    )

    ### instantiate special label and position it relative
    ### to the links

    project_links_caption = Object2D.from_surface(
        surface=(render_text(text=t.splash_screen.links, **TEXT_SETTINGS))
    )

    project_links_caption.rect.bottomleft = project_link_objs.rect.move(-10, -5).topleft

    ### then add the label to the list of objects
    project_link_objs.insert(0, project_links_caption)

    ### finally return the list of objects
    return project_link_objs
Return custom list with link objects.

    That is, objects whose surfaces represent web links.
    
nodezator/splashscreen/factoryfuncs.py