From 5f92772bf56e6b7177483ce140c06289ee34023c Mon Sep 17 00:00:00 2001 From: Neriya Cohen Date: Sun, 28 Dec 2025 18:00:51 +0200 Subject: [PATCH] Fix #42 --- src/pydom/context/standard/__init__.py | 1 + .../context/standard/transformers/__init__.py | 3 +- .../transformers/simple_transformer.py | 22 --------- .../transformers/simple_transformers.py | 49 +++++++++++++++++++ src/pydom/types/html/html_input_element.py | 48 ++++++++++++++---- 5 files changed, 90 insertions(+), 33 deletions(-) delete mode 100644 src/pydom/context/standard/transformers/simple_transformer.py create mode 100644 src/pydom/context/standard/transformers/simple_transformers.py diff --git a/src/pydom/context/standard/__init__.py b/src/pydom/context/standard/__init__.py index 1180dd5..755d1af 100644 --- a/src/pydom/context/standard/__init__.py +++ b/src/pydom/context/standard/__init__.py @@ -6,6 +6,7 @@ def add_standard_features(ctx: Context): ctx.add_prop_transformer(t.FalsyTransformer()) ctx.add_prop_transformer(t.ClassTransformer()) ctx.add_prop_transformer(t.SimpleTransformer()) + ctx.add_prop_transformer(t.SimpleInputTransformer()) ctx.add_prop_transformer(t.StyleTransformer()) ctx.add_prop_transformer(t.InnerHTMLTransformer()) # Order matters diff --git a/src/pydom/context/standard/transformers/__init__.py b/src/pydom/context/standard/transformers/__init__.py index 904ef56..019062b 100644 --- a/src/pydom/context/standard/transformers/__init__.py +++ b/src/pydom/context/standard/transformers/__init__.py @@ -3,7 +3,7 @@ from .falsy_transformer import FalsyTransformer from .html_events_transformer import HTMLEventsTransformer from .inner_html_transformer import InnerHTMLTransformer -from .simple_transformer import SimpleTransformer +from .simple_transformers import SimpleTransformer, SimpleInputTransformer from .style_transformer import StyleTransformer __all__ = [ @@ -13,5 +13,6 @@ "HTMLEventsTransformer", "InnerHTMLTransformer", "SimpleTransformer", + "SimpleInputTransformer", "StyleTransformer", ] diff --git a/src/pydom/context/standard/transformers/simple_transformer.py b/src/pydom/context/standard/transformers/simple_transformer.py deleted file mode 100644 index 433b253..0000000 --- a/src/pydom/context/standard/transformers/simple_transformer.py +++ /dev/null @@ -1,22 +0,0 @@ -from ....rendering.transformers import PropertyTransformer - -_SIMPLE_TRANSFORMERS = { - "html_for": "for", - "access_key": "accesskey", - "content_editable": "contenteditable", - "cross_origin": "crossorigin", - "tab_index": "tabindex", - "use_map": "usemap", - "col_span": "colspan", - "row_span": "rowspan", - "char_set": "charset", -} - - -class SimpleTransformer(PropertyTransformer): - def match(self, prop_name, _) -> bool: - return prop_name in _SIMPLE_TRANSFORMERS - - def transform(self, prop_name, _, element): - element.props[_SIMPLE_TRANSFORMERS[prop_name]] = _ - del element.props[prop_name] diff --git a/src/pydom/context/standard/transformers/simple_transformers.py b/src/pydom/context/standard/transformers/simple_transformers.py new file mode 100644 index 0000000..0fd43d5 --- /dev/null +++ b/src/pydom/context/standard/transformers/simple_transformers.py @@ -0,0 +1,49 @@ +from ....rendering.transformers import PropertyTransformer + +_SIMPLE_TRANSFORMERS = { + "html_for": "for", + "access_key": "accesskey", + "content_editable": "contenteditable", + "cross_origin": "crossorigin", + "tab_index": "tabindex", + "use_map": "usemap", + "col_span": "colspan", + "row_span": "rowspan", + "char_set": "charset", +} + + +class SimpleTransformer(PropertyTransformer): + def match(self, prop_name, _) -> bool: + return prop_name in _SIMPLE_TRANSFORMERS + + def transform(self, prop_name, prop_value, element, /): + element.props[_SIMPLE_TRANSFORMERS[prop_name]] = prop_value + del element.props[prop_name] + + +_SIMPLE_INPUT_TRANSFORMERS = { + "auto_capitalize": "autocapitalize", + "auto_complete": "autocomplete", + "auto_focus": "autofocus", + "form_action": "formaction", + "form_enctype": "formenctype", + "form_method": "formmethod", + "form_no_validate": "formnovalidate", + "form_target": "formtarget", + "max_length": "maxlength", + "min_length": "minlength", + "popover_target": "popovertarget", + "popover_target_action": "popovertargetaction", +} + + +class SimpleInputTransformer(PropertyTransformer): + def match(self, prop_name, _) -> bool: + return prop_name in _SIMPLE_INPUT_TRANSFORMERS + + def transform(self, prop_name, prop_value, element, /): + if element.node.tag_name != "input": + return + element.props[_SIMPLE_INPUT_TRANSFORMERS[prop_name]] = prop_value + del element.props[prop_name] diff --git a/src/pydom/types/html/html_input_element.py b/src/pydom/types/html/html_input_element.py index ec33e14..54680cc 100644 --- a/src/pydom/types/html/html_input_element.py +++ b/src/pydom/types/html/html_input_element.py @@ -1,15 +1,44 @@ -from typing import Optional +from typing import Literal, Optional from pydom.types.html.html_element_props import HTMLElementProps +InputType = Literal[ + "button", + "checkbox", + "color", + "date", + "datetime-local", + "email", + "file", + "hidden", + "image", + "month", + "number", + "password", + "radio", + "range", + "reset", + "search", + "submit", + "tel", + "text", + "time", + "url", + "week", +] + + class HTMLInputElement(HTMLElementProps, total=False): accept: Optional[str] + alpha: Optional[bool] alt: Optional[str] + auto_capitalize: Optional[str] auto_complete: Optional[str] - auto_focus: Optional[str] + auto_focus: Optional[bool] capture: Optional[str] - checked: Optional[str] - cross_origin: Optional[str] + checked: Optional[bool] + color_space: Optional[str] + dirname: Optional[str] disabled: Optional[bool] form: Optional[str] form_action: Optional[str] @@ -27,14 +56,13 @@ class HTMLInputElement(HTMLElementProps, total=False): name: Optional[str] pattern: Optional[str] placeholder: Optional[str] - readonly: Optional[str] - required: Optional[str] - selection_direction: Optional[str] - selection_end: Optional[str] - selection_start: Optional[str] + popover_target: Optional[str] + popover_target_action: Optional[str] + readonly: Optional[bool] + required: Optional[bool] size: Optional[str] src: Optional[str] step: Optional[str] - type: Optional[str] + type: Optional[InputType] value: Optional[str] width: Optional[str]