Ich bin neu in Elm und ich liebe es so weit, aber ich habe ein Problem, dass ich nicht scheinen kann, um meinen Kopf zu wickeln.Transform Html DOM
Ich habe einen HTML-DOM, zum Beispiel
div []
[ h1 [] [text "Headline 1"]
, p [] [text "Some text"]
, h2 [] [text "Headline 2"]
]
I a-Links in jedem h hinzufügen möchte [1-6] Element und so verwandelt es so etwas wie (es einfach zu halten)
div []
[ h1 [] [ text "Headline 1"
, [a [name "headline"] [text "#"]
]
, p [] [text "Some text"]
, h2 [] [text "Headline 2"
, [a [name "headline"] [text "#"]
]
]
Dies ist konzeptionell nicht sehr schwer. Schauen Sie sich das DOM an, wenn Element h [1-6] ist, fügen Sie eine A-Verknüpfung als untergeordnetes Element hinzu. Allerdings ist mein Verständnis von Elm nicht gut genug, um es zur Arbeit zu bringen.
Hier ist was ich bisher versucht habe.
transform : Html a -> Html a
transform node =
-- check if the tag is h1-h6
case node.tag of
-- add a-link to h1 children
"h1" -> { node | children = (a [name "headline"] [text "#") :: node.children }
"h2" -> { node | children = (a [name "headline"] [text "#") :: node.children }
-- do this for all nodes in the tree
_ -> { node | children = List.map transform node.children }
Dies funktioniert nicht.
The type annotation for `transform` does not match its definition.
40| transform : Html a -> Html a
^^^^^^^^^^^^^^^^
The type annotation is saying:
VirtualDom.Node a -> VirtualDom.Node a
But I am inferring that the definition has this type:
{ b | tag : String, children : List (Html a) }
-> { b | children : List (Html a), tag : String }
Ich verstehe, dass ich nicht node.tag
tun kann, weil der generische Typ a
nicht das Feld haben könnte. Es wäre nicht typsicher. Zum Beispiel hat der Textknoten kein Tag-Feld, ist aber immer noch eine Instanz von Html.Html a
.
> text "Hello World"
{ type = "text", text = "Hello World" } : Html.Html a
Meine Frage ist, wie kann ich das tun? Darf ich das machen? oder sollte ich das nicht tun?
Ich vermutete, dass Ausgangs Javascript war. Meine "Html msg" kommt von der Ausgabe von 'Markdown.toHtml' also habe ich keine gute Möglichkeit, es zu manipulieren, bevor es als 'Html msg' von' Markdown.toHtml' zurückgegeben wird. Schade ist es nicht möglich, die Ausgabe zu transformieren. –