Markup icon indicating copy to clipboard operation
Markup copied to clipboard

Some idea to allow extending MarkupNode with own cases?

Open saltwat5r opened this issue 7 years ago • 7 comments

As in the title 😄

saltwat5r avatar Aug 01 '17 07:08 saltwat5r

That depends on what you want to add 😄. Could you please be more specific?

gonzalezreal avatar Aug 02 '17 07:08 gonzalezreal

I.e. add case superscript([MarkupNode]) and many more.

saltwat5r avatar Aug 02 '17 08:08 saltwat5r

Ok, so you want to add more delimiters. Implementing the superscript would involve the following:

  1. Add the character ^ in MarkupTokenizer
  2. Add a superscript([MarkupNode]) case to MarkupNode
  3. Customize the MarkupNode constructor to handle the ^ delimiter.
  4. Customize the MarkupRenderer to handle superscript nodes appropriately.
  5. Add the corresponding tests here and here.

After completing those steps you should be able to take text like Hello^*world*^ and obtain Helloworld.

gonzalezreal avatar Aug 02 '17 09:08 gonzalezreal

I've done it in the same way, but I was wondering how to do it more flexible without modifying your code and add more cases by i.e. extensions for your classes :)

saltwat5r avatar Aug 02 '17 09:08 saltwat5r

To be honest, I did not think about a generic way to extend the parser or renderer. Doing so will probably mean not using an enum for the nodes, as swift enums cannot be extended with additional cases. In any case, it is out of the scope and was not my intention when I published this library.

If you find an elegant and generic way to extend it, please do let me know. It is an interesting exercise.

gonzalezreal avatar Aug 02 '17 14:08 gonzalezreal

@gonzalezreal how can I add an rule which looks like "TEXT" where "**" is the new delimiter. The focus on this question is that I use two characters as delimiter.

Kurt57 avatar Oct 29 '18 10:10 Kurt57

Hi @Kurt57,

That would involve substantial changes in MarkupTokenizer.

  • Refactor the delimiters constant into an array of strings (currently is a CharacterSet)
  • Refactor all the code relying in that constant.

Also it would require changing MarkupToken to accept strings as associated values instead of UnicodeScalar.

Finally, refactor all the code that depends on the MarkupToken (mainly the parser).

As you can see, a lot of work 😅

gonzalezreal avatar Oct 29 '18 14:10 gonzalezreal