Coverage for meta_tags_parser/snippets.py: 100%
26 statements
« prev ^ index » next coverage.py v7.10.3, created at 2026-08-22 19:08 +0000
« prev ^ index » next coverage.py v7.10.3, created at 2026-08-22 19:08 +0000
1import dataclasses
2import typing
4from . import parse, structs
7def _parse_dimension(dimension_text: str) -> int:
8 cleaned_text: typing.Final[str] = dimension_text.strip()
9 if not cleaned_text:
10 return 0
11 if not cleaned_text.isascii() or not cleaned_text.isdigit():
12 return 0
13 return int(cleaned_text)
16def parse_snippets_from_source(
17 source_code: str | bytes,
18 *,
19 options: structs.SettingsFromUser | None = None,
20) -> structs.SnippetGroup:
21 active_options: typing.Final[structs.SettingsFromUser] = parse.resolve_active_options(options)
22 snippets_options: typing.Final[structs.SettingsFromUser] = dataclasses.replace(
23 active_options,
24 what_to_parse=(structs.WhatToParse.OPEN_GRAPH, structs.WhatToParse.TWITTER),
25 )
26 parsed_group: typing.Final[structs.TagsGroup] = parse.parse_meta_tags_from_source(
27 source_code,
28 options=snippets_options,
29 )
30 prepared_group_data: typing.Final[dict[str, structs.SocialMediaSnippet]] = {}
31 social_name: str
32 parsed_tags: list[structs.OneMetaTag]
33 for social_name, parsed_tags in (
34 ("twitter", parsed_group.twitter),
35 ("open_graph", parsed_group.open_graph),
36 ):
37 prepared_snippet_data: dict[str, typing.Any] = {}
38 one_meta_tag: structs.OneMetaTag
39 for one_meta_tag in parsed_tags:
40 snippet_field_name: str = one_meta_tag.normalized_name
41 if snippet_field_name not in structs.WHAT_ATTRS_IN_SOCIAL_MEDIA_SNIPPET:
42 continue
43 # og/twitter allow repeated tags (multiple images for example), the first one is the primary one
44 if snippet_field_name in prepared_snippet_data:
45 continue
46 prepared_snippet_data[snippet_field_name] = (
47 _parse_dimension(one_meta_tag.value)
48 if snippet_field_name in structs.DIMENSION_SNIPPET_FIELDS
49 else one_meta_tag.value
50 )
51 prepared_group_data[social_name] = structs.SocialMediaSnippet(**prepared_snippet_data)
52 return structs.SnippetGroup(**prepared_group_data)