-
-
Notifications
You must be signed in to change notification settings - Fork 57
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Serializing mdast to markdown #64
Comments
No, this is not yet possible, as You can work on this. Though, it is involved work that takes a while. The good part is that everything has already been implemented in JavaScript. Finally, “complete” roundtripping ( |
Will this work? Passing on the 'serde_json' serialized format to mdast-util-to-markdown? |
perhaps |
I wrote a likely crummy implementation of this for a personal project here, would something like this make sense as a PR or a new crate? It passes a (much) weaker version of the proptest @Enoumy proposes, where string -> mdast -> string2 -> mdast -> string3 produces an equivalent string2 and string3 (assuming I understand how proptest works 😁 ) I don't think it covers all the possible nodes mdasts can include, and it applies some opinionated formatting. I also suspect this recursive approach is bad for performance. (I'm learning rust through this project, so I wouldn't be surprised to learn something about this code is very far from best practices) |
Nice start and welcome to rust :)
|
I'll leave this code in my own project then. I found this issue when I was already mostly done with this implementation, so I couldn't until it was too late. I'll take a look now, but I don't plan to write something new when I have something that works for me. Edit: if nothing else I need to copy the unsafe character support... |
@wooorm, do you know why wouldn't leveraging the |
“to string” is already a thing in the mdast world, getting just the text out. |
I see. I will try to work on a PR then 🙂. |
Thanks for you work @wooorm it will be so handy to have this as crate/feature, is there any plans soon to add it into the project ? |
Please read the comments above yours. Thanks. |
Yeah, my bad I asked that question because the comment was in 2023 and I thought there might be other plans. I have time now which I can spend to help with this issue, @moy2010 mind me if I ask, do you need any help here, have you started working on this issue if not maybe I can start kicking things off with the Rust version ? |
Sorry, @bnchi . I started looking into it, but ultimately decided to ditch it because my original plan was to convert from my domain format -> mdast -> markdown, and instead I just did the conversion directly without mdast as the intermediary model. |
I know a little bit about parsers and I read part of the JS implementation, appreciate if you can help me here and let me know if my intuition and the steps in which I'm going to be implementing this make sense. The JS depends on the use of unist-util-visit which seems to help visit nodes of some type in a tree, it has a little bit of useful methods, and the Rust implementation doesn't seem to have that abstraction. It probably make sense to do the following :
One part which I don't have a clear mental model of in the JS implementation :
what's the difference between a state and a tracker, is there a documentation that describes the logic behind them ? |
Hmm the Visitor abstraction might be a nice to have and is not needed for this specific case since we're only going to be serializing straight to markdown so we can match against the Node variant and call the appropriate method to do the serializations. The only part which is not clear to me is state.enter('type?') How this type help in traversing the tree ? |
There are indeed many utilities in the javascript ecosystem already, which are not there yet in Rust.
The types might help: The tracker tracks positional info. There are several trackers. Small objects. The state is a bigger thing, it tracks the entire process.
It is often important to know where you are, when serializing markdown. |
If I understood what you said correctly does that mean state is conceptually a state machine that track where you're in the tree and it's used to call the correct handle method for the children of a parent from within the containerPhrasing and conteinerFlow to serialize into markdown. If my above assumption is correct do you think it makes sense to replicate the same model in Rust or do you have a better idea ? Also do you have any resources or a way to help me know which type is considered a phrasing content or a flow content ? |
a)
I consider
This is defined in mdast: |
Thanks for the clarification @wooorm I made a small initial commit to lay down the foundation to what I think make sense to serialize in rust : bnchi@973f760 I'm thinking that the traits PhrasingParent and FlowParent will be generated for node type using a macro Let me know if that's an approach you think make sense to move forward and start the full implementation edit |
(Whoops accidentally hit enter before drafting a content for this question, my apologies for the noise!)
Hi! I have a perhaps newbie question! I can use
markdown::to_mdast
to go from&str
->Node
. Is it possible/is there a function to go back to a string - Node -> &str` - in a way that roundtrips?I came across
Node::to_string
, and it does seem to convert nodes into a string but it also deletes the links/titles/and most other ast nodes, which if re-parsed again, results in a different ast. Unsure if this question is reasonable/within the context of this crate, but is there an alternate function elsewhere that is round-trippable to/from&str <-> Node
? I am also happy to take a stab at implementing this "rountrippable" unparser function myself, but was wondering if a function like it already existed.For further clarification, by "roundtripping", I would be writing a property based test, like
markdown::to_mdast(to_string(node)) == node
be true for allnode
's.Thanks!
The text was updated successfully, but these errors were encountered: