|
| 1 | +import pathlib |
| 2 | + |
| 3 | +HERE = pathlib.Path(__file__).parent |
| 4 | +HTML_FILES = HERE / "seamless/html" |
| 5 | + |
| 6 | +# with open(HERE / "__init__.py", "w") as f: |
| 7 | +# items = [] |
| 8 | +# for file in HERE.iterdir(): |
| 9 | +# if file.name.startswith("_") or file.suffix != ".py": |
| 10 | +# continue |
| 11 | + |
| 12 | +# capitalized = file.stem.capitalize() |
| 13 | +# items.append(capitalized) |
| 14 | +# print(f"from .{file.stem} import {capitalized}", file=f) |
| 15 | + |
| 16 | +# all = "\n".join(f'\t"{item}",' for item in items) |
| 17 | +# print(f"\n__all__ = [\n{all}\n]", file=f) |
| 18 | + |
| 19 | + |
| 20 | +html_map = { |
| 21 | + "A": "HTMLAnchorElement", |
| 22 | + "Area": "HTMLAreaElement", |
| 23 | + "Audio": "HTMLAudioElement", |
| 24 | + "Br": "HTMLBRElement", |
| 25 | + "Base": "HTMLBaseElement", |
| 26 | + "Body": "HTMLBodyElement", |
| 27 | + "Button": "HTMLButtonElement", |
| 28 | + "Canvas": "HTMLCanvasElement", |
| 29 | + "Caption": "HTMLTableCaptionElement", |
| 30 | + "Col": "HTMLTableColElement", |
| 31 | + "ColGroup": "HTMLTableColElement", |
| 32 | + "Data": "HTMLDataElement", |
| 33 | + "DataList": "HTMLDataListElement", |
| 34 | + "Del": "HTMLModElement", |
| 35 | + "Details": "HTMLDetailsElement", |
| 36 | + "Dialog": "HTMLDialogElement", |
| 37 | + "Div": "HTMLDivElement", |
| 38 | + "Embed": "HTMLEmbedElement", |
| 39 | + "FieldSet": "HTMLFieldSetElement", |
| 40 | + "Form": "HTMLFormElement", |
| 41 | + "H1": "HTMLHeadingElement", |
| 42 | + "H2": "HTMLHeadingElement", |
| 43 | + "H3": "HTMLHeadingElement", |
| 44 | + "H4": "HTMLHeadingElement", |
| 45 | + "H5": "HTMLHeadingElement", |
| 46 | + "H6": "HTMLHeadingElement", |
| 47 | + "Hr": "HTMLHRElement", |
| 48 | + "Head": "HTMLHeadElement", |
| 49 | + "Heading": "HTMLHeadingElement", |
| 50 | + "Html": "HTMLHtmlElement", |
| 51 | + "IFrame": "HTMLIFrameElement", |
| 52 | + "Image": "HTMLImageElement", |
| 53 | + "Input": "HTMLInputElement", |
| 54 | + "Ins": "HTMLModElement", |
| 55 | + "Li": "HTMLListItemElement", |
| 56 | + "Label": "HTMLLabelElement", |
| 57 | + "Legend": "HTMLLegendElement", |
| 58 | + "Link": "HTMLLinkElement", |
| 59 | + "Map": "HTMLMapElement", |
| 60 | + "Meter": "HTMLMeterElement", |
| 61 | + "Object": "HTMLObjectElement", |
| 62 | + "Ol": "HTMLOrderedListElement", |
| 63 | + "OptGroup": "HTMLOptGroupElement", |
| 64 | + "Option": "HTMLOptionElement", |
| 65 | + "Output": "HTMLOutputElement", |
| 66 | + "P": "HTMLParagraphElement", |
| 67 | + "Param": "HTMLParamElement", |
| 68 | + "Picture": "HTMLPictureElement", |
| 69 | + "Pre": "HTMLPreElement", |
| 70 | + "Progress": "HTMLProgressElement", |
| 71 | + "Q": "HTMLQuoteElement", |
| 72 | + "Script": "HTMLScriptElement", |
| 73 | + "Select": "HTMLSelectElement", |
| 74 | + "Slot": "HTMLSlotElement", |
| 75 | + "Source": "HTMLSourceElement", |
| 76 | + "Span": "HTMLSpanElement", |
| 77 | + "Style": "HTMLStyleElement", |
| 78 | + "Table": "HTMLTableElement", |
| 79 | + "TBody": "HTMLTableSectionElement", |
| 80 | + "Td": "HTMLTableDataCellElement", |
| 81 | + "TFoot": "HTMLTableSectionElement", |
| 82 | + "Th": "HTMLTableHeaderCellElement", |
| 83 | + "THead": "HTMLTableSectionElement", |
| 84 | + "Tr": "HTMLTableRowElement", |
| 85 | + "Template": "HTMLTemplateElement", |
| 86 | + "TextArea": "HTMLTextAreaElement", |
| 87 | + "Time": "HTMLTimeElement", |
| 88 | + "Title": "HTMLTitleElement", |
| 89 | + "Track": "HTMLTrackElement", |
| 90 | + "Ul": "HTMLUnorderedListElement", |
| 91 | + "Video": "HTMLVideoElement", |
| 92 | +} |
| 93 | + |
| 94 | +html_classes = [ |
| 95 | + "A", |
| 96 | + "Abbr", |
| 97 | + "Address", |
| 98 | + "Area", |
| 99 | + "Article", |
| 100 | + "Aside", |
| 101 | + "Audio", |
| 102 | + "B", |
| 103 | + "Base", |
| 104 | + "Bdi", |
| 105 | + "Bdo", |
| 106 | + "BlockQuote", |
| 107 | + "Body", |
| 108 | + "Br", |
| 109 | + "Button", |
| 110 | + "Canvas", |
| 111 | + "Caption", |
| 112 | + "Cite", |
| 113 | + "Code", |
| 114 | + "Col", |
| 115 | + "ColGroup", |
| 116 | + "Data", |
| 117 | + "DataList", |
| 118 | + "Dd", |
| 119 | + "Del", |
| 120 | + "Details", |
| 121 | + "Dfn", |
| 122 | + "Dialog", |
| 123 | + "Div", |
| 124 | + "Dl", |
| 125 | + "Dt", |
| 126 | + "Em", |
| 127 | + "Embed", |
| 128 | + "FieldSet", |
| 129 | + "FigCaption", |
| 130 | + "Figure", |
| 131 | + "Footer", |
| 132 | + "Form", |
| 133 | + "H1", |
| 134 | + "H2", |
| 135 | + "H3", |
| 136 | + "H4", |
| 137 | + "H5", |
| 138 | + "H6", |
| 139 | + "Head", |
| 140 | + "Header", |
| 141 | + "HGroup", |
| 142 | + "Hr", |
| 143 | + "Html", |
| 144 | + "I", |
| 145 | + "IFrame", |
| 146 | + "Img", |
| 147 | + "Input", |
| 148 | + "Ins", |
| 149 | + "Kbd", |
| 150 | + "Label", |
| 151 | + "Legend", |
| 152 | + "Li", |
| 153 | + "Link", |
| 154 | + "Main", |
| 155 | + "Map", |
| 156 | + "Mark", |
| 157 | + "Menu", |
| 158 | + "Meta", |
| 159 | + "Meter", |
| 160 | + "Nav", |
| 161 | + "NoScript", |
| 162 | + "Object", |
| 163 | + "Ol", |
| 164 | + "OptGroup", |
| 165 | + "Option", |
| 166 | + "Output", |
| 167 | + "P", |
| 168 | + "Param", |
| 169 | + "Picture", |
| 170 | + "Pre", |
| 171 | + "Progress", |
| 172 | + "Q", |
| 173 | + "Rp", |
| 174 | + "Rt", |
| 175 | + "Ruby", |
| 176 | + "S", |
| 177 | + "Samp", |
| 178 | + "Script", |
| 179 | + "Search", |
| 180 | + "Section", |
| 181 | + "Select", |
| 182 | + "Slot", |
| 183 | + "Small", |
| 184 | + "Source", |
| 185 | + "Span", |
| 186 | + "Strong", |
| 187 | + "Style", |
| 188 | + "Sub", |
| 189 | + "Summary", |
| 190 | + "Sup", |
| 191 | + "Svg", |
| 192 | + "Table", |
| 193 | + "TBody", |
| 194 | + "Td", |
| 195 | + "Template", |
| 196 | + "TextArea", |
| 197 | + "TFoot", |
| 198 | + "Th", |
| 199 | + "THead", |
| 200 | + "Time", |
| 201 | + "Title", |
| 202 | + "Tr", |
| 203 | + "Track", |
| 204 | + "U", |
| 205 | + "Ul", |
| 206 | + "Var", |
| 207 | + "Video", |
| 208 | + "Wbr", |
| 209 | +] |
| 210 | + |
| 211 | +inline_html_classes = [ |
| 212 | + "Area", |
| 213 | + "Base", |
| 214 | + "Br", |
| 215 | + "Col", |
| 216 | + "Embed", |
| 217 | + "Hr", |
| 218 | + "Img", |
| 219 | + "Input", |
| 220 | + "Link", |
| 221 | + "Meta", |
| 222 | + "Param", |
| 223 | + "Source", |
| 224 | + "Track", |
| 225 | + "Wbr", |
| 226 | +] |
| 227 | + |
| 228 | +html_map = {key: html_map.get(key, "HTMLElementProps") for key in html_classes} |
| 229 | + |
| 230 | +template = """from typing import TYPE_CHECKING, Unpack |
| 231 | +from ..element import Element |
| 232 | +
|
| 233 | +if TYPE_CHECKING: |
| 234 | + from ..types.html import {props_class_name} |
| 235 | + from ..types import ChildType |
| 236 | +
|
| 237 | +class {class_name}(Element): |
| 238 | + def __init__(self, *children: "ChildType", **kwargs: Unpack["{props_class_name}"]): |
| 239 | + super().__init__(*children, **kwargs) |
| 240 | +
|
| 241 | + tag_name = "{class_name_lower}"{inline} |
| 242 | +""" |
| 243 | + |
| 244 | +inline_string = "\n inline = True" |
| 245 | + |
| 246 | +lower_keys = {key.lower(): key for key in html_map} |
| 247 | + |
| 248 | +for cls, props in html_map.items(): |
| 249 | + class_name = cls |
| 250 | + class_name_lower = class_name.lower() |
| 251 | + props_class_name = props |
| 252 | + filename = f"{class_name_lower}.py" |
| 253 | + inline = inline_string if class_name in inline_html_classes else "" |
| 254 | + |
| 255 | + if class_name == "Meta": |
| 256 | + continue |
| 257 | + |
| 258 | + if class_name == "Del": |
| 259 | + filename = "del_.py" |
| 260 | + |
| 261 | + with open(HTML_FILES / filename, "w") as f: |
| 262 | + f.write(template.format(class_name=class_name, class_name_lower=class_name_lower, props_class_name=props_class_name, inline=inline)) |
| 263 | + |
| 264 | + |
0 commit comments