From a9b7da18902fcea0564a462a6b058a6087f51c22 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Fri, 9 Dec 2022 12:00:37 -0600 Subject: [PATCH] remove some unused files --- packages/rsx/src/attributes.rs | 892 -------------------------- packages/rsx/src/template.rs | 1064 -------------------------------- 2 files changed, 1956 deletions(-) delete mode 100644 packages/rsx/src/attributes.rs delete mode 100644 packages/rsx/src/template.rs diff --git a/packages/rsx/src/attributes.rs b/packages/rsx/src/attributes.rs deleted file mode 100644 index 8920d69af..000000000 --- a/packages/rsx/src/attributes.rs +++ /dev/null @@ -1,892 +0,0 @@ -use crate::elements::*; - -// map the rsx name of the attribute to the html name of the attribute, the namespace that contains it, and if the attribute is volitile -pub fn attrbute_to_static_str( - attr: &str, - element: &'static str, - namespace: Option<&'static str>, -) -> Option<(&'static str, Option<&'static str>, bool)> { - if namespace == Some("http://www.w3.org/2000/svg") { - svg::MAPPED_ATTRIBUTES - .iter() - .find(|(a, _)| *a == attr) - .map(|(_, b)| (*b, None, false)) - } else { - NO_NAMESPACE_ATTRIBUTES - .iter() - .find(|&a| *a == attr) - .map(|a| (*a, None, false)) - .or_else(|| { - STYLE_ATTRIBUTES - .iter() - .find(|(a, _)| *a == attr) - .map(|(_, b)| (*b, Some("style"), false)) - }) - .or_else(|| { - MAPPED_ATTRIBUTES - .iter() - .find(|(a, _)| *a == attr) - .map(|(_, b)| (*b, None, false)) - }) - } - .or_else(|| { - ELEMENTS_WITH_MAPPED_ATTRIBUTES - .iter() - .find_map(|(el, attrs)| { - (element == *el) - .then(|| { - attrs - .iter() - .find(|(a, _, _)| *a == attr) - .map(|(_, b, volitile)| (*b, None, *volitile)) - }) - .flatten() - }) - }) - .or_else(|| { - ELEMENTS_WITH_NAMESPACE.iter().find_map(|(el, ns, attrs)| { - (element == *el && namespace == Some(*ns)) - .then(|| { - attrs - .iter() - .find(|a| **a == attr) - .map(|a| (*a, None, false)) - }) - .flatten() - }) - }) - .or_else(|| { - ELEMENTS_WITHOUT_NAMESPACE.iter().find_map(|(el, attrs)| { - (element == *el) - .then(|| { - attrs - .iter() - .find(|a| **a == attr) - .map(|a| (*a, None, false)) - }) - .flatten() - }) - }) -} - -macro_rules! no_namespace_trait_methods { - ( - $( - $(#[$attr:meta])* - $name:ident; - )* - ) => { - pub const NO_NAMESPACE_ATTRIBUTES: &'static [&'static str] = &[ - $( - stringify!($name), - )* - ]; - }; -} - -macro_rules! style_trait_methods { - ( - $( - $(#[$attr:meta])* - $name:ident: $lit:literal, - )* - ) => { - pub const STYLE_ATTRIBUTES: &'static [(&'static str, &'static str)] = &[ - $( - (stringify!($name), $lit), - )* - ]; - }; -} - -macro_rules! mapped_trait_methods { - ( - $( - $(#[$attr:meta])* - $name:ident: $lit:literal, - )* - ) => { - pub const MAPPED_ATTRIBUTES: &'static [(&'static str, &'static str)] = &[ - $( - (stringify!($name), $lit), - )* - ("prevent_default", "dioxus-prevent-default"), - ]; - }; -} - -no_namespace_trait_methods! { - accesskey; - - /// The HTML class attribute is used to specify a class for an HTML element. - /// - /// ## Details - /// Multiple HTML elements can share the same class. - /// - /// The class global attribute is a space-separated list of the case-sensitive classes of the element. - /// Classes allow CSS and Javascript to select and access specific elements via the class selectors or - /// functions like the DOM method document.getElementsByClassName. - /// - /// ## Example - /// - /// ### HTML: - /// ```html - ///

Above point sounds a bit obvious. Remove/rewrite?

- /// ``` - /// - /// ### CSS: - /// ```css - /// .note { - /// font-style: italic; - /// font-weight: bold; - /// } - /// - /// .editorial { - /// background: rgb(255, 0, 0, .25); - /// padding: 10px; - /// } - /// ``` - class; - contenteditable; - data; - dir; - draggable; - hidden; - id; - lang; - spellcheck; - style; - tabindex; - title; - translate; - - role; - - /// dangerous_inner_html is Dioxus's replacement for using innerHTML in the browser DOM. In general, setting - /// HTML from code is risky because it’s easy to inadvertently expose your users to a cross-site scripting (XSS) - /// attack. So, you can set HTML directly from Dioxus, but you have to type out dangerous_inner_html to remind - /// yourself that it’s dangerous - dangerous_inner_html; -} - -// This macro creates an explicit method call for each of the style attributes. -// -// The left token specifies the name of the attribute in the rsx! macro, and the right string literal specifies the -// actual name of the attribute generated. -// -// This roughly follows the html spec -style_trait_methods! { - align_content: "align-content", - align_items: "align-items", - align_self: "align-self", - alignment_adjust: "alignment-adjust", - alignment_baseline: "alignment-baseline", - all: "all", - alt: "alt", - animation: "animation", - animation_delay: "animation-delay", - animation_direction: "animation-direction", - animation_duration: "animation-duration", - animation_fill_mode: "animation-fill-mode", - animation_iteration_count: "animation-iteration-count", - animation_name: "animation-name", - animation_play_state: "animation-play-state", - animation_timing_function: "animation-timing-function", - azimuth: "azimuth", - backface_visibility: "backface-visibility", - background: "background", - background_attachment: "background-attachment", - background_clip: "background-clip", - background_color: "background-color", - background_image: "background-image", - background_origin: "background-origin", - background_position: "background-position", - background_repeat: "background-repeat", - background_size: "background-size", - background_blend_mode: "background-blend-mode", - baseline_shift: "baseline-shift", - bleed: "bleed", - bookmark_label: "bookmark-label", - bookmark_level: "bookmark-level", - bookmark_state: "bookmark-state", - border: "border", - border_color: "border-color", - border_style: "border-style", - border_width: "border-width", - border_bottom: "border-bottom", - border_bottom_color: "border-bottom-color", - border_bottom_style: "border-bottom-style", - border_bottom_width: "border-bottom-width", - border_left: "border-left", - border_left_color: "border-left-color", - border_left_style: "border-left-style", - border_left_width: "border-left-width", - border_right: "border-right", - border_right_color: "border-right-color", - border_right_style: "border-right-style", - border_right_width: "border-right-width", - border_top: "border-top", - border_top_color: "border-top-color", - border_top_style: "border-top-style", - border_top_width: "border-top-width", - border_collapse: "border-collapse", - border_image: "border-image", - border_image_outset: "border-image-outset", - border_image_repeat: "border-image-repeat", - border_image_slice: "border-image-slice", - border_image_source: "border-image-source", - border_image_width: "border-image-width", - border_radius: "border-radius", - border_bottom_left_radius: "border-bottom-left-radius", - border_bottom_right_radius: "border-bottom-right-radius", - border_top_left_radius: "border-top-left-radius", - border_top_right_radius: "border-top-right-radius", - border_spacing: "border-spacing", - bottom: "bottom", - box_decoration_break: "box-decoration-break", - box_shadow: "box-shadow", - box_sizing: "box-sizing", - box_snap: "box-snap", - break_after: "break-after", - break_before: "break-before", - break_inside: "break-inside", - buffered_rendering: "buffered-rendering", - caption_side: "caption-side", - clear: "clear", - clear_side: "clear-side", - clip: "clip", - clip_path: "clip-path", - clip_rule: "clip-rule", - color: "color", - color_adjust: "color-adjust", - color_correction: "color-correction", - color_interpolation: "color-interpolation", - color_interpolation_filters: "color-interpolation-filters", - color_profile: "color-profile", - color_rendering: "color-rendering", - column_fill: "column-fill", - column_gap: "column-gap", - column_rule: "column-rule", - column_rule_color: "column-rule-color", - column_rule_style: "column-rule-style", - column_rule_width: "column-rule-width", - column_span: "column-span", - columns: "columns", - column_count: "column-count", - column_width: "column-width", - contain: "contain", - content: "content", - counter_increment: "counter-increment", - counter_reset: "counter-reset", - counter_set: "counter-set", - cue: "cue", - cue_after: "cue-after", - cue_before: "cue-before", - cursor: "cursor", - direction: "direction", - display: "display", - display_inside: "display-inside", - display_outside: "display-outside", - display_extras: "display-extras", - display_box: "display-box", - dominant_baseline: "dominant-baseline", - elevation: "elevation", - empty_cells: "empty-cells", - enable_background: "enable-background", - fill: "fill", - fill_opacity: "fill-opacity", - fill_rule: "fill-rule", - filter: "filter", - float: "float", - float_defer_column: "float-defer-column", - float_defer_page: "float-defer-page", - float_offset: "float-offset", - float_wrap: "float-wrap", - flow_into: "flow-into", - flow_from: "flow-from", - flex: "flex", - flex_basis: "flex-basis", - flex_grow: "flex-grow", - flex_shrink: "flex-shrink", - flex_flow: "flex-flow", - flex_direction: "flex-direction", - flex_wrap: "flex-wrap", - flood_color: "flood-color", - flood_opacity: "flood-opacity", - font: "font", - font_family: "font-family", - font_size: "font-size", - font_stretch: "font-stretch", - font_style: "font-style", - font_weight: "font-weight", - font_feature_settings: "font-feature-settings", - font_kerning: "font-kerning", - font_language_override: "font-language-override", - font_size_adjust: "font-size-adjust", - font_synthesis: "font-synthesis", - font_variant: "font-variant", - font_variant_alternates: "font-variant-alternates", - font_variant_caps: "font-variant-caps", - font_variant_east_asian: "font-variant-east-asian", - font_variant_ligatures: "font-variant-ligatures", - font_variant_numeric: "font-variant-numeric", - font_variant_position: "font-variant-position", - footnote_policy: "footnote-policy", - glyph_orientation_horizontal: "glyph-orientation-horizontal", - glyph_orientation_vertical: "glyph-orientation-vertical", - grid: "grid", - grid_auto_flow: "grid-auto-flow", - grid_auto_columns: "grid-auto-columns", - grid_auto_rows: "grid-auto-rows", - grid_template: "grid-template", - grid_template_areas: "grid-template-areas", - grid_template_columns: "grid-template-columns", - grid_template_rows: "grid-template-rows", - grid_area: "grid-area", - grid_column: "grid-column", - grid_column_start: "grid-column-start", - grid_column_end: "grid-column-end", - grid_row: "grid-row", - grid_row_start: "grid-row-start", - grid_row_end: "grid-row-end", - hanging_punctuation: "hanging-punctuation", - height: "height", - hyphenate_character: "hyphenate-character", - hyphenate_limit_chars: "hyphenate-limit-chars", - hyphenate_limit_last: "hyphenate-limit-last", - hyphenate_limit_lines: "hyphenate-limit-lines", - hyphenate_limit_zone: "hyphenate-limit-zone", - hyphens: "hyphens", - icon: "icon", - image_orientation: "image-orientation", - image_resolution: "image-resolution", - image_rendering: "image-rendering", - ime: "ime", - ime_align: "ime-align", - ime_mode: "ime-mode", - ime_offset: "ime-offset", - ime_width: "ime-width", - initial_letters: "initial-letters", - inline_box_align: "inline-box-align", - isolation: "isolation", - justify_content: "justify-content", - justify_items: "justify-items", - justify_self: "justify-self", - kerning: "kerning", - left: "left", - letter_spacing: "letter-spacing", - lighting_color: "lighting-color", - line_box_contain: "line-box-contain", - line_break: "line-break", - line_grid: "line-grid", - line_height: "line-height", - line_slack: "line-slack", - line_snap: "line-snap", - list_style: "list-style", - list_style_image: "list-style-image", - list_style_position: "list-style-position", - list_style_type: "list-style-type", - margin: "margin", - margin_bottom: "margin-bottom", - margin_left: "margin-left", - margin_right: "margin-right", - margin_top: "margin-top", - marker: "marker", - marker_end: "marker-end", - marker_mid: "marker-mid", - marker_pattern: "marker-pattern", - marker_segment: "marker-segment", - marker_start: "marker-start", - marker_knockout_left: "marker-knockout-left", - marker_knockout_right: "marker-knockout-right", - marker_side: "marker-side", - marks: "marks", - marquee_direction: "marquee-direction", - marquee_play_count: "marquee-play-count", - marquee_speed: "marquee-speed", - marquee_style: "marquee-style", - mask: "mask", - mask_image: "mask-image", - mask_repeat: "mask-repeat", - mask_position: "mask-position", - mask_clip: "mask-clip", - mask_origin: "mask-origin", - mask_size: "mask-size", - mask_box: "mask-box", - mask_box_outset: "mask-box-outset", - mask_box_repeat: "mask-box-repeat", - mask_box_slice: "mask-box-slice", - mask_box_source: "mask-box-source", - mask_box_width: "mask-box-width", - mask_type: "mask-type", - max_height: "max-height", - max_lines: "max-lines", - max_width: "max-width", - min_height: "min-height", - min_width: "min-width", - mix_blend_mode: "mix-blend-mode", - nav_down: "nav-down", - nav_index: "nav-index", - nav_left: "nav-left", - nav_right: "nav-right", - nav_up: "nav-up", - object_fit: "object-fit", - object_position: "object-position", - offset_after: "offset-after", - offset_before: "offset-before", - offset_end: "offset-end", - offset_start: "offset-start", - opacity: "opacity", - order: "order", - orphans: "orphans", - outline: "outline", - outline_color: "outline-color", - outline_style: "outline-style", - outline_width: "outline-width", - outline_offset: "outline-offset", - overflow: "overflow", - overflow_x: "overflow-x", - overflow_y: "overflow-y", - overflow_style: "overflow-style", - overflow_wrap: "overflow-wrap", - padding: "padding", - padding_bottom: "padding-bottom", - padding_left: "padding-left", - padding_right: "padding-right", - padding_top: "padding-top", - page: "page", - page_break_after: "page-break-after", - page_break_before: "page-break-before", - page_break_inside: "page-break-inside", - paint_order: "paint-order", - pause: "pause", - pause_after: "pause-after", - pause_before: "pause-before", - perspective: "perspective", - perspective_origin: "perspective-origin", - pitch: "pitch", - pitch_range: "pitch-range", - play_during: "play-during", - pointer_events: "pointer-events", - position: "position", - quotes: "quotes", - region_fragment: "region-fragment", - resize: "resize", - rest: "rest", - rest_after: "rest-after", - rest_before: "rest-before", - richness: "richness", - right: "right", - ruby_align: "ruby-align", - ruby_merge: "ruby-merge", - ruby_position: "ruby-position", - scroll_behavior: "scroll-behavior", - scroll_snap_coordinate: "scroll-snap-coordinate", - scroll_snap_destination: "scroll-snap-destination", - scroll_snap_points_x: "scroll-snap-points-x", - scroll_snap_points_y: "scroll-snap-points-y", - scroll_snap_type: "scroll-snap-type", - shape_image_threshold: "shape-image-threshold", - shape_inside: "shape-inside", - shape_margin: "shape-margin", - shape_outside: "shape-outside", - shape_padding: "shape-padding", - shape_rendering: "shape-rendering", - size: "size", - speak: "speak", - speak_as: "speak-as", - speak_header: "speak-header", - speak_numeral: "speak-numeral", - speak_punctuation: "speak-punctuation", - speech_rate: "speech-rate", - stop_color: "stop-color", - stop_opacity: "stop-opacity", - stress: "stress", - string_set: "string-set", - stroke: "stroke", - stroke_dasharray: "stroke-dasharray", - stroke_dashoffset: "stroke-dashoffset", - stroke_linecap: "stroke-linecap", - stroke_linejoin: "stroke-linejoin", - stroke_miterlimit: "stroke-miterlimit", - stroke_opacity: "stroke-opacity", - stroke_width: "stroke-width", - tab_size: "tab-size", - table_layout: "table-layout", - text_align: "text-align", - text_align_all: "text-align-all", - text_align_last: "text-align-last", - text_anchor: "text-anchor", - text_combine_upright: "text-combine-upright", - text_decoration: "text-decoration", - text_decoration_color: "text-decoration-color", - text_decoration_line: "text-decoration-line", - text_decoration_style: "text-decoration-style", - text_decoration_skip: "text-decoration-skip", - text_emphasis: "text-emphasis", - text_emphasis_color: "text-emphasis-color", - text_emphasis_style: "text-emphasis-style", - text_emphasis_position: "text-emphasis-position", - text_emphasis_skip: "text-emphasis-skip", - text_height: "text-height", - text_indent: "text-indent", - text_justify: "text-justify", - text_orientation: "text-orientation", - text_overflow: "text-overflow", - text_rendering: "text-rendering", - text_shadow: "text-shadow", - text_size_adjust: "text-size-adjust", - text_space_collapse: "text-space-collapse", - text_spacing: "text-spacing", - text_transform: "text-transform", - text_underline_position: "text-underline-position", - text_wrap: "text-wrap", - top: "top", - touch_action: "touch-action", - transform: "transform", - transform_box: "transform-box", - transform_origin: "transform-origin", - transform_style: "transform-style", - transition: "transition", - transition_delay: "transition-delay", - transition_duration: "transition-duration", - transition_property: "transition-property", - unicode_bidi: "unicode-bidi", - vector_effect: "vector-effect", - vertical_align: "vertical-align", - visibility: "visibility", - voice_balance: "voice-balance", - voice_duration: "voice-duration", - voice_family: "voice-family", - voice_pitch: "voice-pitch", - voice_range: "voice-range", - voice_rate: "voice-rate", - voice_stress: "voice-stress", - voice_volumn: "voice-volumn", - volume: "volume", - white_space: "white-space", - widows: "widows", - width: "width", - will_change: "will-change", - word_break: "word-break", - word_spacing: "word-spacing", - word_wrap: "word-wrap", - wrap_flow: "wrap-flow", - wrap_through: "wrap-through", - writing_mode: "writing-mode", - gap: "gap", - list_styler_type: "list-style-type", - row_gap: "row-gap", - transition_timing_function: "transition-timing-function", - user_select: "user-select", - webkit_user_select: "-webkit-user-select", - z_index : "z-index", -} -mapped_trait_methods! { - aria_current: "aria-current", - aria_details: "aria-details", - aria_disabled: "aria-disabled", - aria_hidden: "aria-hidden", - aria_invalid: "aria-invalid", - aria_keyshortcuts: "aria-keyshortcuts", - aria_label: "aria-label", - aria_roledescription: "aria-roledescription", - // Widget Attributes - aria_autocomplete: "aria-autocomplete", - aria_checked: "aria-checked", - aria_expanded: "aria-expanded", - aria_haspopup: "aria-haspopup", - aria_level: "aria-level", - aria_modal: "aria-modal", - aria_multiline: "aria-multiline", - aria_multiselectable: "aria-multiselectable", - aria_orientation: "aria-orientation", - aria_placeholder: "aria-placeholder", - aria_pressed: "aria-pressed", - aria_readonly: "aria-readonly", - aria_required: "aria-required", - aria_selected: "aria-selected", - aria_sort: "aria-sort", - aria_valuemax: "aria-valuemax", - aria_valuemin: "aria-valuemin", - aria_valuenow: "aria-valuenow", - aria_valuetext: "aria-valuetext", - // Live Region Attributes - aria_atomic: "aria-atomic", - aria_busy: "aria-busy", - aria_live: "aria-live", - aria_relevant: "aria-relevant", - - aria_dropeffect: "aria-dropeffect", - aria_grabbed: "aria-grabbed", - // Relationship Attributes - aria_activedescendant: "aria-activedescendant", - aria_colcount: "aria-colcount", - aria_colindex: "aria-colindex", - aria_colspan: "aria-colspan", - aria_controls: "aria-controls", - aria_describedby: "aria-describedby", - aria_errormessage: "aria-errormessage", - aria_flowto: "aria-flowto", - aria_labelledby: "aria-labelledby", - aria_owns: "aria-owns", - aria_posinset: "aria-posinset", - aria_rowcount: "aria-rowcount", - aria_rowindex: "aria-rowindex", - aria_rowspan: "aria-rowspan", - aria_setsize: "aria-setsize", -} - -pub mod svg { - mapped_trait_methods! { - accent_height: "accent-height", - accumulate: "accumulate", - additive: "additive", - alignment_baseline: "alignment-baseline", - alphabetic: "alphabetic", - amplitude: "amplitude", - arabic_form: "arabic-form", - ascent: "ascent", - attributeName: "attributeName", - attributeType: "attributeType", - azimuth: "azimuth", - baseFrequency: "baseFrequency", - baseline_shift: "baseline-shift", - baseProfile: "baseProfile", - bbox: "bbox", - begin: "begin", - bias: "bias", - by: "by", - calcMode: "calcMode", - cap_height: "cap-height", - class: "class", - clip: "clip", - clipPathUnits: "clipPathUnits", - clip_path: "clip-path", - clip_rule: "clip-rule", - color: "color", - color_interpolation: "color-interpolation", - color_interpolation_filters: "color-interpolation-filters", - color_profile: "color-profile", - color_rendering: "color-rendering", - contentScriptType: "contentScriptType", - contentStyleType: "contentStyleType", - crossorigin: "crossorigin", - cursor: "cursor", - cx: "cx", - cy: "cy", - d: "d", - decelerate: "decelerate", - descent: "descent", - diffuseConstant: "diffuseConstant", - direction: "direction", - display: "display", - divisor: "divisor", - dominant_baseline: "dominant-baseline", - dur: "dur", - dx: "dx", - dy: "dy", - edgeMode: "edgeMode", - elevation: "elevation", - enable_background: "enable-background", - end: "end", - exponent: "exponent", - fill: "fill", - fill_opacity: "fill-opacity", - fill_rule: "fill-rule", - filter: "filter", - filterRes: "filterRes", - filterUnits: "filterUnits", - flood_color: "flood-color", - flood_opacity: "flood-opacity", - font_family: "font-family", - font_size: "font-size", - font_size_adjust: "font-size-adjust", - font_stretch: "font-stretch", - font_style: "font-style", - font_variant: "font-variant", - font_weight: "font-weight", - format: "format", - from: "from", - fr: "fr", - fx: "fx", - fy: "fy", - g1: "g1", - g2: "g2", - glyph_name: "glyph-name", - glyph_orientation_horizontal: "glyph-orientation-horizontal", - glyph_orientation_vertical: "glyph-orientation-vertical", - glyphRef: "glyphRef", - gradientTransform: "gradientTransform", - gradientUnits: "gradientUnits", - hanging: "hanging", - height: "height", - href: "href", - hreflang: "hreflang", - horiz_adv_x: "horiz-adv-x", - horiz_origin_x: "horiz-origin-x", - id: "id", - ideographic: "ideographic", - image_rendering: "image-rendering", - _in: "_in", - in2: "in2", - intercept: "intercept", - k: "k", - k1: "k1", - k2: "k2", - k3: "k3", - k4: "k4", - kernelMatrix: "kernelMatrix", - kernelUnitLength: "kernelUnitLength", - kerning: "kerning", - keyPoints: "keyPoints", - keySplines: "keySplines", - keyTimes: "keyTimes", - lang: "lang", - lengthAdjust: "lengthAdjust", - letter_spacing: "letter-spacing", - lighting_color: "lighting-color", - limitingConeAngle: "limitingConeAngle", - local: "local", - marker_end: "marker-end", - marker_mid: "marker-mid", - marker_start: "marker_start", - markerHeight: "markerHeight", - markerUnits: "markerUnits", - markerWidth: "markerWidth", - mask: "mask", - maskContentUnits: "maskContentUnits", - maskUnits: "maskUnits", - mathematical: "mathematical", - max: "max", - media: "media", - method: "method", - min: "min", - mode: "mode", - name: "name", - numOctaves: "numOctaves", - offset: "offset", - opacity: "opacity", - operator: "operator", - order: "order", - orient: "orient", - orientation: "orientation", - origin: "origin", - overflow: "overflow", - overline_position: "overline-position", - overline_thickness: "overline-thickness", - panose_1: "panose-1", - paint_order: "paint-order", - path: "path", - pathLength: "pathLength", - patternContentUnits: "patternContentUnits", - patternTransform: "patternTransform", - patternUnits: "patternUnits", - ping: "ping", - pointer_events: "pointer-events", - points: "points", - pointsAtX: "pointsAtX", - pointsAtY: "pointsAtY", - pointsAtZ: "pointsAtZ", - preserveAlpha: "preserveAlpha", - preserveAspectRatio: "preserveAspectRatio", - primitiveUnits: "primitiveUnits", - r: "r", - radius: "radius", - referrerPolicy: "referrerPolicy", - refX: "refX", - refY: "refY", - rel: "rel", - rendering_intent: "rendering-intent", - repeatCount: "repeatCount", - repeatDur: "repeatDur", - requiredExtensions: "requiredExtensions", - requiredFeatures: "requiredFeatures", - restart: "restart", - result: "result", - role: "role", - rotate: "rotate", - rx: "rx", - ry: "ry", - scale: "scale", - seed: "seed", - shape_rendering: "shape-rendering", - slope: "slope", - spacing: "spacing", - specularConstant: "specularConstant", - specularExponent: "specularExponent", - speed: "speed", - spreadMethod: "spreadMethod", - startOffset: "startOffset", - stdDeviation: "stdDeviation", - stemh: "stemh", - stemv: "stemv", - stitchTiles: "stitchTiles", - stop_color: "stop_color", - stop_opacity: "stop_opacity", - strikethrough_position: "strikethrough-position", - strikethrough_thickness: "strikethrough-thickness", - string: "string", - stroke: "stroke", - stroke_dasharray: "stroke-dasharray", - stroke_dashoffset: "stroke-dashoffset", - stroke_linecap: "stroke-linecap", - stroke_linejoin: "stroke-linejoin", - stroke_miterlimit: "stroke-miterlimit", - stroke_opacity: "stroke-opacity", - stroke_width: "stroke-width", - style: "style", - surfaceScale: "surfaceScale", - systemLanguage: "systemLanguage", - tabindex: "tabindex", - tableValues: "tableValues", - target: "target", - targetX: "targetX", - targetY: "targetY", - text_anchor: "text-anchor", - text_decoration: "text-decoration", - text_rendering: "text-rendering", - textLength: "textLength", - to: "to", - transform: "transform", - transform_origin: "transform-origin", - r#type: "_type", - u1: "u1", - u2: "u2", - underline_position: "underline-position", - underline_thickness: "underline-thickness", - unicode: "unicode", - unicode_bidi: "unicode-bidi", - unicode_range: "unicode-range", - units_per_em: "units-per-em", - v_alphabetic: "v-alphabetic", - v_hanging: "v-hanging", - v_ideographic: "v-ideographic", - v_mathematical: "v-mathematical", - values: "values", - vector_effect: "vector-effect", - version: "version", - vert_adv_y: "vert-adv-y", - vert_origin_x: "vert-origin-x", - vert_origin_y: "vert-origin-y", - view_box: "viewBox", - view_target: "viewTarget", - visibility: "visibility", - width: "width", - widths: "widths", - word_spacing: "word-spacing", - writing_mode: "writing-mode", - x: "x", - x_height: "x-height", - x1: "x1", - x2: "x2", - xmlns: "xmlns", - x_channel_selector: "xChannelSelector", - y: "y", - y1: "y1", - y2: "y2", - y_channel_selector: "yChannelSelector", - z: "z", - zoomAndPan: "zoomAndPan", - } -} diff --git a/packages/rsx/src/template.rs b/packages/rsx/src/template.rs deleted file mode 100644 index 22c73ae33..000000000 --- a/packages/rsx/src/template.rs +++ /dev/null @@ -1,1064 +0,0 @@ -// use proc_macro2::TokenStream; -// use quote::TokenStreamExt; -// use quote::{quote, ToTokens}; -// use syn::{Expr, Ident, LitStr}; - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// pub fn try_parse_template( -// rsx: &str, -// location: OwnedCodeLocation, -// previous_template: Option, -// ) -> Result<(OwnedTemplate, DynamicTemplateContextBuilder), Error> { -// use crate::CallBody; - -// let call_body: CallBody = -// syn::parse_str(rsx).map_err(|e| Error::ParseError(ParseError::new(e, location.clone())))?; -// let mut template_builder = TemplateBuilder::from_roots_always(call_body.roots); -// if let Some(prev) = previous_template { -// template_builder = template_builder -// .try_switch_dynamic_context(prev) -// .ok_or_else(|| { -// Error::RecompileRequiredError(RecompileReason::Variable( -// "dynamic context updated".to_string(), -// )) -// })?; -// } -// let dyn_ctx = template_builder.dynamic_context.clone(); -// Ok((template_builder.try_into_owned(&location)?, dyn_ctx)) -// } - -// use crate::{BodyNode, ElementAttr, FormattedSegment, Segment}; - -// struct TemplateElementBuilder { -// tag: Ident, -// attributes: Vec, -// children: Vec, -// listeners: Vec, -// locally_static: bool, -// } - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// type OwndedTemplateElement = TemplateElement< -// Vec>, -// OwnedAttributeValue, -// Vec, -// Vec, -// >; - -// impl TemplateElementBuilder { -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// fn try_into_owned(self, location: &OwnedCodeLocation) -> Result { -// let Self { -// tag, -// attributes, -// children, -// listeners, -// .. -// } = self; -// let (element_tag, element_ns) = -// element_to_static_str(&tag.to_string()).ok_or_else(|| { -// Error::ParseError(ParseError::new( -// syn::Error::new(tag.span(), format!("unknown element: {}", tag)), -// location.clone(), -// )) -// })?; - -// let mut owned_attributes = Vec::new(); -// for a in attributes { -// owned_attributes.push(a.try_into_owned(location, element_tag, element_ns)?); -// } - -// Ok(TemplateElement::new( -// element_tag, -// element_ns, -// owned_attributes, -// children, -// listeners, -// )) -// } -// } - -// impl ToTokens for TemplateElementBuilder { -// fn to_tokens(&self, tokens: &mut TokenStream) { -// let Self { -// tag, -// attributes, -// children, -// listeners, -// .. -// } = self; -// let children = children.iter().map(|id| { -// let raw = id.0; -// quote! {TemplateNodeId(#raw)} -// }); -// tokens.append_all(quote! { -// TemplateElement::new( -// dioxus_elements::#tag::TAG_NAME, -// dioxus_elements::#tag::NAME_SPACE, -// &[#(#attributes),*], -// &[#(#children),*], -// &[#(#listeners),*], -// ) -// }) -// } -// } - -// enum AttributeName { -// Ident(Ident), -// Str(LitStr), -// } - -// struct TemplateAttributeBuilder { -// element_tag: Ident, -// name: AttributeName, -// value: TemplateAttributeValue, -// } - -// impl TemplateAttributeBuilder { -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// fn try_into_owned( -// self, -// location: &OwnedCodeLocation, -// element_tag: &'static str, -// element_ns: Option<&'static str>, -// ) -> Result, Error> { -// let Self { name, value, .. } = self; -// let (name, span, literal) = match name { -// AttributeName::Ident(name) => (name.to_string(), name.span(), false), -// AttributeName::Str(name) => (name.value(), name.span(), true), -// }; -// let (name, namespace, volatile) = attrbute_to_static_str(&name, element_tag, element_ns) -// .ok_or_else(|| { -// if literal { -// // literals will be captured when a full recompile is triggered -// Error::RecompileRequiredError(RecompileReason::Attribute(name.to_string())) -// } else { -// Error::ParseError(ParseError::new( -// syn::Error::new(span, format!("unknown attribute: {}", name)), -// location.clone(), -// )) -// } -// })?; -// let attribute = AttributeDiscription { -// name, -// namespace, -// volatile, -// }; -// Ok(TemplateAttribute { value, attribute }) -// } -// } - -// impl ToTokens for TemplateAttributeBuilder { -// fn to_tokens(&self, tokens: &mut TokenStream) { -// let Self { -// element_tag, -// name, -// value, -// } = self; -// let value = match value { -// TemplateAttributeValue::Static(val) => { -// let val = match val { -// OwnedAttributeValue::Text(txt) => quote! {StaticAttributeValue::Text(#txt)}, -// OwnedAttributeValue::Float32(f) => quote! {StaticAttributeValue::Float32(#f)}, -// OwnedAttributeValue::Float64(f) => quote! {StaticAttributeValue::Float64(#f)}, -// OwnedAttributeValue::Int32(i) => quote! {StaticAttributeValue::Int32(#i)}, -// OwnedAttributeValue::Int64(i) => quote! {StaticAttributeValue::Int64(#i)}, -// OwnedAttributeValue::Uint32(u) => quote! {StaticAttributeValue::Uint32(#u)}, -// OwnedAttributeValue::Uint64(u) => quote! {StaticAttributeValue::Uint64(#u)}, -// OwnedAttributeValue::Bool(b) => quote! {StaticAttributeValue::Bool(#b)}, -// OwnedAttributeValue::Vec3Float(f1, f2, f3) => { -// quote! {StaticAttributeValue::Vec3Float(#f1, #f2, #f3)} -// } -// OwnedAttributeValue::Vec3Int(f1, f2, f3) => { -// quote! {StaticAttributeValue::Vec3Int(#f1, #f2, #f3)} -// } -// OwnedAttributeValue::Vec3Uint(f1, f2, f3) => { -// quote! {StaticAttributeValue::Vec3Uint(#f1, #f2, #f3)} -// } -// OwnedAttributeValue::Vec4Float(f1, f2, f3, f4) => { -// quote! {StaticAttributeValue::Vec4Float(#f1, #f2, #f3, #f4)} -// } -// OwnedAttributeValue::Vec4Int(f1, f2, f3, f4) => { -// quote! {StaticAttributeValue::Vec4Int(#f1, #f2, #f3, #f4)} -// } -// OwnedAttributeValue::Vec4Uint(f1, f2, f3, f4) => { -// quote! {StaticAttributeValue::Vec4Uint(#f1, #f2, #f3, #f4)} -// } -// OwnedAttributeValue::Bytes(b) => { -// quote! {StaticAttributeValue::Bytes(&[#(#b),*])} -// } -// OwnedAttributeValue::Any(_) => todo!(), -// }; -// quote! {TemplateAttributeValue::Static(#val)} -// } -// TemplateAttributeValue::Dynamic(idx) => quote! {TemplateAttributeValue::Dynamic(#idx)}, -// }; -// match name { -// AttributeName::Ident(name) => tokens.append_all(quote! { -// TemplateAttribute{ -// attribute: dioxus_elements::#element_tag::#name, -// value: #value, -// } -// }), -// AttributeName::Str(lit) => tokens.append_all(quote! { -// TemplateAttribute{ -// attribute: dioxus::prelude::AttributeDiscription{ -// name: #lit, -// namespace: None, -// volatile: false -// }, -// value: #value, -// } -// }), -// } -// } -// } - -// enum TemplateNodeTypeBuilder { -// Element(TemplateElementBuilder), -// Text(TextTemplate>, String>), -// DynamicNode(usize), -// } - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// type OwnedTemplateNodeType = TemplateNodeType< -// Vec>, -// OwnedAttributeValue, -// Vec, -// Vec, -// Vec>, -// String, -// >; - -// impl TemplateNodeTypeBuilder { -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// fn try_into_owned(self, location: &OwnedCodeLocation) -> Result { -// match self { -// TemplateNodeTypeBuilder::Element(el) => { -// Ok(TemplateNodeType::Element(el.try_into_owned(location)?)) -// } -// TemplateNodeTypeBuilder::Text(txt) => Ok(TemplateNodeType::Text(txt)), -// TemplateNodeTypeBuilder::DynamicNode(idx) => Ok(TemplateNodeType::DynamicNode(idx)), -// } -// } -// } - -// impl ToTokens for TemplateNodeTypeBuilder { -// fn to_tokens(&self, tokens: &mut TokenStream) { -// match self { -// TemplateNodeTypeBuilder::Element(el) => tokens.append_all(quote! { -// TemplateNodeType::Element(#el) -// }), -// TemplateNodeTypeBuilder::Text(txt) => { -// let mut length = 0; - -// let segments = txt.segments.iter().map(|seg| match seg { -// TextTemplateSegment::Static(s) => { -// length += s.len(); -// quote!(TextTemplateSegment::Static(#s)) -// } -// TextTemplateSegment::Dynamic(idx) => quote!(TextTemplateSegment::Dynamic(#idx)), -// }); - -// tokens.append_all(quote! { -// TemplateNodeType::Text(TextTemplate::new(&[#(#segments),*], #length)) -// }); -// } -// TemplateNodeTypeBuilder::DynamicNode(idx) => tokens.append_all(quote! { -// TemplateNodeType::DynamicNode(#idx) -// }), -// } -// } -// } - -// struct TemplateNodeBuilder { -// id: TemplateNodeId, -// depth: usize, -// parent: Option, -// node_type: TemplateNodeTypeBuilder, -// fully_static: bool, -// } - -// impl TemplateNodeBuilder { -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// fn try_into_owned(self, location: &OwnedCodeLocation) -> Result { -// let TemplateNodeBuilder { -// id, -// node_type, -// parent, -// depth, -// .. -// } = self; -// let node_type = node_type.try_into_owned(location)?; -// Ok(OwnedTemplateNode { -// id, -// node_type, -// parent, -// depth, -// }) -// } - -// fn to_tokens(&self, tokens: &mut TokenStream) { -// let Self { -// id, -// node_type, -// parent, -// depth, -// .. -// } = self; -// let raw_id = id.0; -// let parent = match parent { -// Some(id) => { -// let id = id.0; -// quote! {Some(TemplateNodeId(#id))} -// } -// None => quote! {None}, -// }; - -// tokens.append_all(quote! { -// TemplateNode { -// id: TemplateNodeId(#raw_id), -// node_type: #node_type, -// parent: #parent, -// depth: #depth, -// } -// }) -// } -// } - -// #[derive(Default)] -// pub struct TemplateBuilder { -// nodes: Vec, -// root_nodes: Vec, -// dynamic_context: DynamicTemplateContextBuilder, -// } - -// impl TemplateBuilder { -// /// Create a template builder from nodes if it would improve performance to do so. -// pub fn from_roots(roots: Vec) -> Option { -// let mut builder = Self::default(); - -// for (i, root) in roots.into_iter().enumerate() { -// let id = builder.build_node(root, None, vec![i], 0); -// builder.root_nodes.push(id); -// } - -// // only build a template if there is at least one static node -// if builder -// .nodes -// .iter() -// .all(|r| matches!(&r.node_type, TemplateNodeTypeBuilder::DynamicNode(_))) -// { -// None -// } else { -// Some(builder) -// } -// } - -// /// Create a template builder from nodes regardless of performance. -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// fn from_roots_always(roots: Vec) -> Self { -// let mut builder = Self::default(); - -// for (i, root) in roots.into_iter().enumerate() { -// let id = builder.build_node(root, None, vec![i], 0); -// builder.root_nodes.push(id); -// } - -// builder -// } - -// fn build_node( -// &mut self, -// node: BodyNode, -// parent: Option, -// path: Vec, -// depth: usize, -// ) -> TemplateNodeId { -// let id = TemplateNodeId(self.nodes.len()); -// match node { -// BodyNode::Element(el) => { -// let mut locally_static = true; -// let mut attributes = Vec::new(); -// let mut listeners = Vec::new(); -// for attr in el.attributes { -// match attr.attr { -// ElementAttr::AttrText { name, value } => { -// if let Some(static_value) = value.to_static() { -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Ident(name), -// value: TemplateAttributeValue::Static( -// OwnedAttributeValue::Text(static_value), -// ), -// }) -// } else { -// locally_static = false; -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Ident(name), -// value: TemplateAttributeValue::Dynamic( -// self.dynamic_context.add_attr(quote!(#value)), -// ), -// }) -// } -// } -// ElementAttr::CustomAttrText { name, value } => { -// if let Some(static_value) = value.to_static() { -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Str(name), -// value: TemplateAttributeValue::Static( -// OwnedAttributeValue::Text(static_value), -// ), -// }) -// } else { -// locally_static = false; -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Str(name), -// value: TemplateAttributeValue::Dynamic( -// self.dynamic_context.add_attr(quote!(#value)), -// ), -// }) -// } -// } -// ElementAttr::AttrExpression { name, value } => { -// locally_static = false; -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Ident(name), -// value: TemplateAttributeValue::Dynamic( -// self.dynamic_context.add_attr(quote!(#value)), -// ), -// }) -// } -// ElementAttr::CustomAttrExpression { name, value } => { -// locally_static = false; -// attributes.push(TemplateAttributeBuilder { -// element_tag: el.name.clone(), -// name: AttributeName::Str(name), -// value: TemplateAttributeValue::Dynamic( -// self.dynamic_context.add_attr(quote!(#value)), -// ), -// }) -// } -// ElementAttr::EventTokens { name, tokens } => { -// locally_static = false; -// listeners.push(self.dynamic_context.add_listener(name, tokens)) -// } -// } -// } -// if let Some(key) = el.key { -// self.dynamic_context.add_key(quote!( -// dioxus::core::exports::bumpalo::format!(in __bump, "{}", #key) -// .into_bump_str() -// )); -// } -// self.nodes.push(TemplateNodeBuilder { -// id, -// node_type: TemplateNodeTypeBuilder::Element(TemplateElementBuilder { -// tag: el.name, -// attributes, -// children: Vec::new(), -// listeners, -// locally_static, -// }), -// parent, -// depth, -// fully_static: false, -// }); -// let children: Vec<_> = el -// .children -// .into_iter() -// .enumerate() -// .map(|(i, child)| { -// let mut new_path = path.clone(); -// new_path.push(i); -// self.build_node(child, Some(id), new_path, depth + 1) -// }) -// .collect(); -// let children_fully_static = children.iter().all(|c| self.nodes[c.0].fully_static); -// let parent = &mut self.nodes[id.0]; -// parent.fully_static = locally_static && children_fully_static; -// if let TemplateNodeTypeBuilder::Element(element) = &mut parent.node_type { -// element.children = children; -// } -// } - -// BodyNode::Component(comp) => { -// self.nodes.push(TemplateNodeBuilder { -// id, -// node_type: TemplateNodeTypeBuilder::DynamicNode( -// self.dynamic_context.add_node(BodyNode::Component(comp)), -// ), -// parent, -// depth, -// fully_static: false, -// }); -// } - -// BodyNode::Text(txt) => { -// let mut segments = Vec::new(); -// let mut length = 0; -// let mut fully_static = true; - -// for segment in txt.segments { -// segments.push(match segment { -// Segment::Literal(lit) => { -// length += lit.len(); -// TextTemplateSegment::Static(lit) -// } -// Segment::Formatted(fmted) => { -// fully_static = false; -// TextTemplateSegment::Dynamic(self.dynamic_context.add_text(fmted)) -// } -// }) -// } - -// self.nodes.push(TemplateNodeBuilder { -// id, -// node_type: TemplateNodeTypeBuilder::Text(TextTemplate::new(segments, length)), -// parent, -// depth, -// fully_static, -// }); -// } - -// BodyNode::RawExpr(expr) => { -// self.nodes.push(TemplateNodeBuilder { -// id, -// node_type: TemplateNodeTypeBuilder::DynamicNode( -// self.dynamic_context.add_node(BodyNode::RawExpr(expr)), -// ), -// parent, -// depth, -// fully_static: false, -// }); -// } -// } -// id -// } - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// pub fn try_switch_dynamic_context( -// mut self, -// dynamic_context: DynamicTemplateContextBuilder, -// ) -> Option { -// let attribute_mapping: HashMap = dynamic_context -// .attributes -// .iter() -// .enumerate() -// .map(|(i, ts)| (ts.to_string(), i)) -// .collect(); -// let text_mapping: HashMap = dynamic_context -// .text -// .iter() -// .enumerate() -// .map(|(i, ts)| (ts.to_token_stream().to_string(), i)) -// .collect(); -// let listener_mapping: HashMap<(String, Expr), usize> = dynamic_context -// .listeners -// .iter() -// .enumerate() -// .map(|(i, ts)| (ts.clone(), i)) -// .collect(); -// let node_mapping: HashMap = dynamic_context -// .nodes -// .iter() -// .enumerate() -// .map(|(i, ts)| (ts.to_token_stream().to_string(), i)) -// .collect(); - -// for node in &mut self.nodes { -// match &mut node.node_type { -// TemplateNodeTypeBuilder::Element(element) => { -// for listener in &mut element.listeners { -// *listener = -// *listener_mapping.get(&self.dynamic_context.listeners[*listener])?; -// } -// for attribute in &mut element.attributes { -// if let TemplateAttributeValue::Dynamic(idx) = &mut attribute.value { -// *idx = *attribute_mapping -// .get(&self.dynamic_context.attributes[*idx].to_string())?; -// } -// } -// } -// TemplateNodeTypeBuilder::Text(txt) => { -// for seg in &mut txt.segments { -// if let TextTemplateSegment::Dynamic(idx) = seg { -// *idx = *text_mapping.get( -// &self.dynamic_context.text[*idx] -// .to_token_stream() -// .to_string(), -// )?; -// } -// } -// } -// TemplateNodeTypeBuilder::DynamicNode(idx) => { -// *idx = *node_mapping.get( -// &self.dynamic_context.nodes[*idx] -// .to_token_stream() -// .to_string(), -// )?; -// } -// } -// } -// self.dynamic_context = dynamic_context; - -// Some(self) -// } - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// pub fn try_into_owned(self, location: &OwnedCodeLocation) -> Result { -// let mut nodes = Vec::new(); -// let dynamic_mapping = self.dynamic_mapping(&nodes); -// let dynamic_path = self.dynamic_path(); -// for node in self.nodes { -// nodes.push(node.try_into_owned(location)?); -// } - -// Ok(OwnedTemplate { -// nodes, -// root_nodes: self.root_nodes, -// dynamic_mapping, -// dynamic_path, -// }) -// } - -// #[cfg(any(feature = "hot-reload", debug_assertions))] -// pub fn dynamic_mapping( -// &self, -// resolved_nodes: &Vec, -// ) -> OwnedDynamicNodeMapping { -// let dynamic_context = &self.dynamic_context; -// let mut node_mapping = vec![None; dynamic_context.nodes.len()]; -// let nodes = &self.nodes; -// for n in nodes { -// if let TemplateNodeTypeBuilder::DynamicNode(idx) = &n.node_type { -// node_mapping[*idx] = Some(n.id) -// } -// } -// let mut text_mapping = vec![Vec::new(); dynamic_context.text.len()]; -// for n in nodes { -// if let TemplateNodeTypeBuilder::Text(txt) = &n.node_type { -// for seg in &txt.segments { -// match seg { -// TextTemplateSegment::Static(_) => (), -// TextTemplateSegment::Dynamic(idx) => text_mapping[*idx].push(n.id), -// } -// } -// } -// } -// let mut attribute_mapping = vec![Vec::new(); dynamic_context.attributes.len()]; -// for n in nodes { -// if let TemplateNodeTypeBuilder::Element(el) = &n.node_type { -// for (i, attr) in el.attributes.iter().enumerate() { -// match attr.value { -// TemplateAttributeValue::Static(_) => (), -// TemplateAttributeValue::Dynamic(idx) => { -// attribute_mapping[idx].push((n.id, i)); -// } -// } -// } -// } -// } -// let mut listener_mapping = Vec::new(); -// for n in nodes { -// if let TemplateNodeTypeBuilder::Element(el) = &n.node_type { -// if !el.listeners.is_empty() { -// listener_mapping.push(n.id); -// } -// } -// } - -// let mut volatile_mapping = Vec::new(); -// for n in resolved_nodes { -// if let TemplateNodeType::Element(el) = &n.node_type { -// for (i, attr) in el.attributes.iter().enumerate() { -// if attr.attribute.volatile { -// volatile_mapping.push((n.id, i)); -// } -// } -// } -// } - -// OwnedDynamicNodeMapping::new( -// node_mapping, -// text_mapping, -// attribute_mapping, -// volatile_mapping, -// listener_mapping, -// ) -// } - -// fn dynamic_path(&self) -> Option { -// let mut last_seg: Option = None; -// let mut nodes_to_insert_after = Vec::new(); -// // iterating from the last root to the first -// for root in self.root_nodes.iter().rev() { -// let root_node = &self.nodes[root.0]; -// if let TemplateNodeTypeBuilder::DynamicNode(_) = root_node.node_type { -// match &mut last_seg { -// // if there has been no static nodes, we can append the child to the parent node -// None => nodes_to_insert_after.push(*root), -// // otherwise we insert the child before the last static node -// Some(seg) => { -// seg.ops.push(UpdateOp::InsertBefore(*root)); -// } -// } -// } else if let Some(mut new) = self.construct_path_segment(*root) { -// if let Some(last) = last_seg.take() { -// match new.traverse { -// OwnedTraverse::Halt => { -// new.traverse = OwnedTraverse::NextSibling(Box::new(last)); -// } -// OwnedTraverse::FirstChild(b) => { -// new.traverse = OwnedTraverse::Both(Box::new((*b, last))); -// } -// _ => unreachable!(), -// } -// } else { -// for node in nodes_to_insert_after.drain(..) { -// new.ops.push(UpdateOp::InsertAfter(node)); -// } -// } -// last_seg = Some(new); -// } else if let Some(last) = last_seg.take() { -// last_seg = Some(OwnedPathSeg { -// ops: Vec::new(), -// traverse: OwnedTraverse::NextSibling(Box::new(last)), -// }); -// } -// } -// last_seg -// } - -// fn construct_path_segment(&self, node_id: TemplateNodeId) -> Option { -// let n = &self.nodes[node_id.0]; -// if n.fully_static { -// return None; -// } -// match &n.node_type { -// TemplateNodeTypeBuilder::Element(el) => { -// let mut last_seg: Option = None; -// let mut children_to_append = Vec::new(); -// // iterating from the last child to the first -// for child in el.children.iter().rev() { -// let child_node = &self.nodes[child.0]; -// if let TemplateNodeTypeBuilder::DynamicNode(_) = child_node.node_type { -// match &mut last_seg { -// // if there has been no static nodes, we can append the child to the parent node -// None => children_to_append.push(*child), -// // otherwise we insert the child before the last static node -// Some(seg) => { -// seg.ops.push(UpdateOp::InsertBefore(*child)); -// } -// } -// } else if let Some(mut new) = self.construct_path_segment(*child) { -// if let Some(last) = last_seg.take() { -// match new.traverse { -// OwnedTraverse::Halt => { -// new.traverse = OwnedTraverse::NextSibling(Box::new(last)); -// } -// OwnedTraverse::FirstChild(b) => { -// new.traverse = OwnedTraverse::Both(Box::new((*b, last))); -// } -// _ => unreachable!(), -// } -// } -// last_seg = Some(new); -// } else if let Some(last) = last_seg.take() { -// last_seg = Some(OwnedPathSeg { -// ops: Vec::new(), -// traverse: OwnedTraverse::NextSibling(Box::new(last)), -// }); -// } -// } -// let mut ops = Vec::new(); -// if !el.locally_static || n.parent.is_none() { -// ops.push(UpdateOp::StoreNode(node_id)); -// } -// for child in children_to_append.into_iter().rev() { -// ops.push(UpdateOp::AppendChild(child)); -// } -// Some(OwnedPathSeg { -// ops, -// traverse: match last_seg { -// Some(last) => OwnedTraverse::FirstChild(Box::new(last)), -// None => OwnedTraverse::Halt, -// }, -// }) -// } -// TemplateNodeTypeBuilder::Text(_) => Some(OwnedPathSeg { -// ops: vec![UpdateOp::StoreNode(n.id)], -// traverse: dioxus_core::OwnedTraverse::Halt, -// }), -// TemplateNodeTypeBuilder::DynamicNode(_) => unreachable!( -// "constructing path segment for dynamic nodes is handled in the parent node" -// ), -// } -// } -// } - -// impl ToTokens for TemplateBuilder { -// fn to_tokens(&self, tokens: &mut TokenStream) { -// let Self { -// nodes, -// root_nodes, -// dynamic_context, -// } = self; - -// let mut node_mapping = vec![None; dynamic_context.nodes.len()]; -// for n in nodes { -// if let TemplateNodeTypeBuilder::DynamicNode(idx) = &n.node_type { -// node_mapping[*idx] = Some(n.id); -// } -// } -// let mut text_mapping = vec![Vec::new(); dynamic_context.text.len()]; -// for n in nodes { -// if let TemplateNodeTypeBuilder::Text(txt) = &n.node_type { -// for seg in &txt.segments { -// match seg { -// TextTemplateSegment::Static(_) => (), -// TextTemplateSegment::Dynamic(idx) => text_mapping[*idx].push(n.id), -// } -// } -// } -// } -// let mut attribute_mapping = vec![Vec::new(); dynamic_context.attributes.len()]; -// for n in nodes { -// if let TemplateNodeTypeBuilder::Element(el) = &n.node_type { -// for (i, attr) in el.attributes.iter().enumerate() { -// match attr.value { -// TemplateAttributeValue::Static(_) => (), -// TemplateAttributeValue::Dynamic(idx) => { -// attribute_mapping[idx].push((n.id, i)); -// } -// } -// } -// } -// } -// let mut listener_mapping = Vec::new(); -// for n in nodes { -// if let TemplateNodeTypeBuilder::Element(el) = &n.node_type { -// if !el.listeners.is_empty() { -// listener_mapping.push(n.id); -// } -// } -// } - -// let root_nodes = root_nodes.iter().map(|id| { -// let raw = id.0; -// quote! { TemplateNodeId(#raw) } -// }); -// let node_mapping_quoted = node_mapping.iter().map(|op| match op { -// Some(id) => { -// let raw_id = id.0; -// quote! {Some(TemplateNodeId(#raw_id))} -// } -// None => quote! {None}, -// }); -// let text_mapping_quoted = text_mapping.iter().map(|inner| { -// let raw = inner.iter().map(|id| id.0); -// quote! {&[#(TemplateNodeId(#raw)),*]} -// }); -// let attribute_mapping_quoted = attribute_mapping.iter().map(|inner| { -// let raw = inner.iter().map(|(id, _)| id.0); -// let indecies = inner.iter().map(|(_, idx)| idx); -// quote! {&[#((TemplateNodeId(#raw), #indecies)),*]} -// }); -// let listener_mapping_quoted = listener_mapping.iter().map(|id| { -// let raw = id.0; -// quote! {TemplateNodeId(#raw)} -// }); -// let mut nodes_quoted = TokenStream::new(); -// for n in nodes { -// n.to_tokens(&mut nodes_quoted); -// quote! {,}.to_tokens(&mut nodes_quoted); -// } - -// let dynamic_path = match self.dynamic_path() { -// Some(seg) => { -// let seg = quote_owned_segment(seg); -// quote! {Some(#seg)} -// } -// None => quote! {None}, -// }; - -// let quoted = quote! { -// { -// const __NODES: dioxus::prelude::StaticTemplateNodes = &[#nodes_quoted]; -// const __TEXT_MAPPING: &'static [&'static [dioxus::prelude::TemplateNodeId]] = &[#(#text_mapping_quoted),*]; -// const __ATTRIBUTE_MAPPING: &'static [&'static [(dioxus::prelude::TemplateNodeId, usize)]] = &[#(#attribute_mapping_quoted),*]; -// const __ROOT_NODES: &'static [dioxus::prelude::TemplateNodeId] = &[#(#root_nodes),*]; -// const __NODE_MAPPING: &'static [Option] = &[#(#node_mapping_quoted),*]; -// const __NODES_WITH_LISTENERS: &'static [dioxus::prelude::TemplateNodeId] = &[#(#listener_mapping_quoted),*]; -// static __VOLITALE_MAPPING_INNER: dioxus::core::exports::once_cell::sync::Lazy> = dioxus::core::exports::once_cell::sync::Lazy::new(||{ -// // check each property to see if it is volatile -// let mut volatile = Vec::new(); -// for n in __NODES { -// if let TemplateNodeType::Element(el) = &n.node_type { -// for (i, attr) in el.attributes.iter().enumerate() { -// if attr.attribute.volatile { -// volatile.push((n.id, i)); -// } -// } -// } -// } -// volatile -// }); -// static __VOLITALE_MAPPING: &'static dioxus::core::exports::once_cell::sync::Lazy> = &__VOLITALE_MAPPING_INNER; -// static __STATIC_VOLITALE_MAPPING: dioxus::prelude::LazyStaticVec<(dioxus::prelude::TemplateNodeId, usize)> = LazyStaticVec(__VOLITALE_MAPPING); -// static __TEMPLATE: dioxus::prelude::Template = Template::Static(&StaticTemplate { -// nodes: __NODES, -// root_nodes: __ROOT_NODES, -// dynamic_mapping: StaticDynamicNodeMapping::new(__NODE_MAPPING, __TEXT_MAPPING, __ATTRIBUTE_MAPPING, __STATIC_VOLITALE_MAPPING, __NODES_WITH_LISTENERS), -// dynamic_path: #dynamic_path, -// }); - -// let __bump = __cx.bump(); -// __cx.template_ref(dioxus::prelude::TemplateId(get_line_num!()), __TEMPLATE.clone(), #dynamic_context) -// } -// }; - -// tokens.append_all(quoted) -// } -// } - -// #[derive(Default, Clone, Debug)] -// pub struct DynamicTemplateContextBuilder { -// nodes: Vec, -// text: Vec, -// attributes: Vec, -// listeners: Vec<(String, Expr)>, -// key: Option, -// } - -// impl DynamicTemplateContextBuilder { -// fn add_node(&mut self, node: BodyNode) -> usize { -// let node_id = self.nodes.len(); - -// self.nodes.push(node); - -// node_id -// } - -// fn add_text(&mut self, text: FormattedSegment) -> usize { -// let text_id = self.text.len(); - -// self.text.push(text); - -// text_id -// } - -// fn add_attr(&mut self, attr: TokenStream) -> usize { -// let attr_id = self.attributes.len(); - -// self.attributes.push(attr); - -// attr_id -// } - -// fn add_listener(&mut self, name: Ident, listener: Expr) -> usize { -// let listener_id = self.listeners.len(); - -// self.listeners.push((name.to_string(), listener)); - -// listener_id -// } - -// fn add_key(&mut self, key: TokenStream) { -// self.key = Some(key); -// } -// } - -// impl ToTokens for DynamicTemplateContextBuilder { -// fn to_tokens(&self, tokens: &mut TokenStream) { -// let nodes = &self.nodes; -// let text = &self.text; -// let attributes = &self.attributes; -// let listeners_names = self -// .listeners -// .iter() -// .map(|(n, _)| syn::parse_str::(n).expect(n)); -// let listeners_exprs = self.listeners.iter().map(|(_, e)| e); -// let key = match &self.key { -// Some(k) => quote!(Some(#k)), -// None => quote!(None), -// }; -// tokens.append_all(quote! { -// TemplateContext { -// nodes: __cx.bump().alloc([#(#nodes),*]), -// text_segments: __cx.bump().alloc([#(&*dioxus::core::exports::bumpalo::format!(in __bump, "{}", #text).into_bump_str()),*]), -// attributes: __cx.bump().alloc([#({#attributes}.into_value(__cx.bump())),*]), -// listeners: __cx.bump().alloc([#(dioxus_elements::on::#listeners_names(__cx, #listeners_exprs)),*]), -// key: #key, -// } -// }) -// } -// } - -// fn quote_owned_segment(seg: OwnedPathSeg) -> proc_macro2::TokenStream { -// let OwnedPathSeg { ops, traverse } = seg; - -// let ops = ops -// .into_iter() -// .map(|op| match op { -// UpdateOp::StoreNode(id) => { -// let id = quote_template_node_id(id); -// quote!(UpdateOp::StoreNode(#id)) -// } -// UpdateOp::InsertBefore(id) => { -// let id = quote_template_node_id(id); -// quote!(UpdateOp::InsertBefore(#id)) -// } -// UpdateOp::InsertAfter(id) => { -// let id = quote_template_node_id(id); -// quote!(UpdateOp::InsertAfter(#id)) -// } -// UpdateOp::AppendChild(id) => { -// let id = quote_template_node_id(id); -// quote!(UpdateOp::AppendChild(#id)) -// } -// }) -// .collect::>(); - -// let traverse = quote_owned_traverse(traverse); - -// quote! { -// StaticPathSeg { -// ops: &[#(#ops),*], -// traverse: #traverse, -// } -// } -// } - -// fn quote_owned_traverse(traverse: OwnedTraverse) -> proc_macro2::TokenStream { -// match traverse { -// OwnedTraverse::Halt => { -// quote! {StaticTraverse::Halt} -// } -// OwnedTraverse::FirstChild(seg) => { -// let seg = quote_owned_segment(*seg); -// quote! {StaticTraverse::FirstChild(&#seg)} -// } -// OwnedTraverse::NextSibling(seg) => { -// let seg = quote_owned_segment(*seg); -// quote! {StaticTraverse::NextSibling(&#seg)} -// } -// OwnedTraverse::Both(b) => { -// let (child, sibling) = *b; -// let child = quote_owned_segment(child); -// let sibling = quote_owned_segment(sibling); -// quote! {StaticTraverse::Both(&(#child, #sibling))} -// } -// } -// } - -// fn quote_template_node_id(id: TemplateNodeId) -> proc_macro2::TokenStream { -// let raw = id.0; -// quote! { -// TemplateNodeId(#raw) -// } -// }