Source code for indieweb_utils.posts.representative_h_card

from dataclasses import dataclass
from typing import Any, Dict, Optional

import mf2py

from ..parsing.parse import get_parsed_mf2_data


class RepresentativeHCardParsingError(Exception):
    pass


@dataclass
class RepresentativeHCard:
    # TODO: Fill this out with a full h-card object
    pass


[docs]def get_representative_h_card(url: str, html: str = "", parsed_mf2: Optional[mf2py.Parser] = None) -> Dict[str, Any]: """ Get the representative h-card on a page per the Representative h-card Parsing algorithm. refs: https://microformats.org/wiki/representative-h-card-parsing :url: The url to parse. :type url: str :return: The representative h-card. :rtype: dict Example: .. code-block:: python import indieweb_utils url = "https://jamesg.blog/" h_card = indieweb_utils.get_representative_h_card(url) print(h_card) # {'type': ['h-card'], 'properties': {...}} :raises RepresentativeHCardParsingError: Representative h-card could not be parsed. """ mf2_data = get_parsed_mf2_data(parsed_mf2, html, url) if not mf2_data: raise RepresentativeHCardParsingError("No mf2 data found.") if not mf2_data.get("items"): raise RepresentativeHCardParsingError("No items found.") h_cards = [card for card in mf2_data["items"] if card.get("type") and card.get("type")[0] == "h-card"] rel_me_links = mf2_data["rels"].get("me", []) for h_card in h_cards: if h_card.get("uid", "") == url and h_card.get("url", "") == url: return h_card if h_card.get("url", "") in rel_me_links: return h_card if len(h_cards) == 1: return h_card return {}