The discussion revolves around limiting certain Markdown features for the first post of a topic, generated by a plugin. hawm wants to restrict Markdown rendering for specific content added by the plugin, such as custom BBCode tags or HTML wrappers. This restriction aims to prevent potential side effects and is only required for the first post.
hawm proposed a possible solution by wrapping the cook method in the Post model to include a features option, allowing for conditional Markdown rendering based on whether it’s the first post or not.
I want to limit some markdown features for the topic’s first post, which is from my plugin.
It could easily be implemented on the client side by accessing the topicFirstPost attribute of the composer model. However, on the server side in the lib/pretty_text.rb and model/post.rb, I found that only the topic_id is passed to the cook method. I could possibly check the posts_count attribute of the topic, but it won’t work when rebaking.
Perhaps, I shouldn’t use any state in the markdown-it process?
Another way to accomplish this is to generate a placeholder using markdown, then update the preview manually and listen to some cook post-process events on the server side, but that might require some additional work.
I’d prefer the first way if possible. Thanks for any suggestions.
Please imagine that the plugin adds some custom BBCode tags, or wraps any text with a custom HTML tag for later use, such as decorating it. I don’t want it to take effect outside the first post (or based on other conditions), since I don’t need it and it may cause some side effects.
Also, I may have found a possible solution on the server side. It wraps the cook method of the Post model. I haven’t tested it yet.
class ::Post
# wrap the original cook method to add features option
# see the markdown method in lib/pretty_text.rb
alias_method :original_cook, :cook
def cook(raw, opts = {})
features = {
'feature-name': is_first_post?
}
if opts.has_key?(:features)
opts[:features].merge!(features)
else
opts[:features] = features
end
original_cook(raw, opts)
end
end