2021-01-18 15:52:49 +01:00
|
|
|
#
|
2023-11-21 21:29:58 +01:00
|
|
|
# This file is licensed under the Affero General Public License (AGPL) version 3.
|
|
|
|
#
|
2024-01-23 12:26:48 +01:00
|
|
|
# Copyright 2021 The Matrix.org Foundation C.I.C.
|
2023-11-21 21:29:58 +01:00
|
|
|
# Copyright (C) 2023 New Vector, Ltd
|
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Affero General Public License as
|
|
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
|
|
# License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# See the GNU Affero General Public License for more details:
|
|
|
|
# <https://www.gnu.org/licenses/agpl-3.0.html>.
|
|
|
|
#
|
|
|
|
# Originally licensed under the Apache License, Version 2.0:
|
|
|
|
# <http://www.apache.org/licenses/LICENSE-2.0>.
|
|
|
|
#
|
|
|
|
# [This file includes modifications made by New Vector Limited]
|
2021-01-18 15:52:49 +01:00
|
|
|
#
|
|
|
|
#
|
|
|
|
|
|
|
|
from html.parser import HTMLParser
|
2023-02-08 22:29:49 +01:00
|
|
|
from typing import Dict, Iterable, List, NoReturn, Optional, Tuple
|
2021-01-18 15:52:49 +01:00
|
|
|
|
|
|
|
|
|
|
|
class TestHtmlParser(HTMLParser):
|
|
|
|
"""A generic HTML page parser which extracts useful things from the HTML"""
|
|
|
|
|
2023-02-08 22:29:49 +01:00
|
|
|
def __init__(self) -> None:
|
2021-01-18 15:52:49 +01:00
|
|
|
super().__init__()
|
|
|
|
|
|
|
|
# a list of links found in the doc
|
2021-07-13 12:52:58 +02:00
|
|
|
self.links: List[str] = []
|
2021-01-18 15:52:49 +01:00
|
|
|
|
|
|
|
# the values of any hidden <input>s: map from name to value
|
2021-07-13 12:52:58 +02:00
|
|
|
self.hiddens: Dict[str, Optional[str]] = {}
|
2021-01-18 15:52:49 +01:00
|
|
|
|
|
|
|
# the values of any radio buttons: map from name to list of values
|
2021-07-13 12:52:58 +02:00
|
|
|
self.radios: Dict[str, List[Optional[str]]] = {}
|
2021-01-18 15:52:49 +01:00
|
|
|
|
|
|
|
def handle_starttag(
|
|
|
|
self, tag: str, attrs: Iterable[Tuple[str, Optional[str]]]
|
|
|
|
) -> None:
|
|
|
|
attr_dict = dict(attrs)
|
|
|
|
if tag == "a":
|
|
|
|
href = attr_dict["href"]
|
|
|
|
if href:
|
|
|
|
self.links.append(href)
|
|
|
|
elif tag == "input":
|
|
|
|
input_name = attr_dict.get("name")
|
|
|
|
if attr_dict["type"] == "radio":
|
|
|
|
assert input_name
|
|
|
|
self.radios.setdefault(input_name, []).append(attr_dict["value"])
|
|
|
|
elif attr_dict["type"] == "hidden":
|
|
|
|
assert input_name
|
|
|
|
self.hiddens[input_name] = attr_dict["value"]
|
|
|
|
|
2023-02-08 22:29:49 +01:00
|
|
|
def error(self, message: str) -> NoReturn:
|
2021-01-18 15:52:49 +01:00
|
|
|
raise AssertionError(message)
|