Hello again,
I’m happy to announce that I have a working parser fully based on regex and a
default implementation for Markdown based on Gruber’s Markdown 1.0.1 (Dec 2004)
specification. The only thing I could not figure out is the blank line between
list items to generate a paragraph in the list item instead of plain text (that
is very ambiguous to me and sounds a bit odd) and instead I decided that all
list items cannot contain plain text (a very simple approach, I know).
A preview site is up and running:
http://www.markdownparser.development.andrei15193.ro/
Critics and comments are welcomed.
PS: can someone point me to some test suites you use? I would like more test
cases (the ones I wrote are really rudimentary). Also big documents for
performance testing would be nice.
Andrei Fangli
From: Andrei Fangli
Sent: Saturday, 16 August 2014 17:34
To: markdown-discuss@six.pairlist.net
Hello!
I'm new around here this being my first post (if I did posted in a wrong meaner
please point it out).
Since you guys are working on Markdown syntax & parsers I thought I should butt
in and show off with a little piece of work that I have been working on.
Since I followed the interview with John Gruber and he stated that he wouldn't
want to standardize Markdown and would rather keep the syntax description
ambiguous so flavors of the language may emerge to suit the needs of the one(s)
using Markdown. I realized that a parser with fixed syntax would not encourage
these "flavors" at all. Nor encourage people to use it much (since my
interpretation of Markdown is not universal). With that in mind I shifted from
defining a rather "static" parser to a more flexible one.
The implementation (in Perl) offered by John Gruber relies heavily on regex
which gave me an idea. I'm a C# developer therefore what I am working on
targets .NET Framework and the idea that I got was to make parser that relies
mostly on the object model of Regex offered by .NET. The current implementation
is rather a prototype for a greater more powerful parser.
Now to make more sense of what I am talking about. I wrote the implementation
of the parser in an abstract class delegating to subclasses what factories for
node creation to use (Factory Method that returns a list of Strategies where
the Strategy is object creation). There are two types of nodes: leaf and
composite thus there are two Strategy interfaces.
The ILeafNodeFactory has a Pattern (Regex), a Name (to use when referencing
factories from a composite one and a Create method which, obviously, creates
the node given a regex Match).
The ICompositeNodeFactory has the same stuff as ILeafNodeFactory only that the
Create method takes an extra parameter (a list of child nodes) and for a
composite node factory you need to specify what factories are applicable to
obtain child nodes (both leaf and composite work).
When you want your specific "flavor" of Markdown you simply subclass the
MarkdownParser and implement the abstract methods. This means providing a list
of ILeafNodeFactory, a list of ICompositeNodeFactory and the name of the
factory to apply for the root node. For each node factory you need to provide a
unique name and a pattern which identifies the sequence of text representing
the node. For composite node factories you also need to provide a list of
factory names to know what node factories to use when trying to identify a
child node text sequence.
The factories are tested in the base class. E.g.: you reference a factory that
does not exist, exception is thrown. Or your composite factory has
MarkdownTextNode as children and in the applicable child node factories say
that a factory which returns a MarkdownNode (base class of MarkdownTextNode)
then an exception is thrown because there is no implicit conversion from
MarkdownNode to MarkdownTextNode.
All these validations are done in the base class constructor (MarkdownParser)
meaning that if you want to test your specification you only need to create an
instance of it and see if it throws any exceptions.
Sadly I haven't got yet to properly testing the parser much (just a dummy test
with 2 factories) or make a default implementation for the rules specified on
John Gruber's site but I am looking forward to it. The project source code is
hosted on BItBucket: <https://bitbucket.org/Andrei15193/markdownparser>.
I hope I wasn't too techy or lacky in details. Constructive comments and
critics are welcomed! Thanks in advance. :)
Yours,
Andrei
_______________________________________________
Markdown-Discuss mailing list
Markdown-Discuss@six.pairlist.net
http://six.pairlist.net/mailman/listinfo/markdown-discuss
_______________________________________________
Markdown-Discuss mailing list
Markdown-Discuss@six.pairlist.net
http://six.pairlist.net/mailman/listinfo/markdown-discuss