[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: ANNOUNCE: lunamark - PEG-based markdown conversion library
- From: John MacFarlane <jgm@...>
- Date: Sun, 13 Sep 2009 00:10:08 -0700
+++ Yuri Takhteyev [Sep 12 09 17:23 ]:
> > lunamark currently converts standard markdown to either HTML or
> > LaTeX. In my tests, it is faster than markdown.lua, though still
> > considerably slower than the lua binding to discount.
>
> On the tests I did last night (after John announced this on the
> markdown list), lunamark was 5-6 times faster than markdown.lua and
> 12-13 times slower than discount on a 500-word input file. The
> difference in speed from markdown.lua seemed to increase for larger
> files.
>
> John: will there be a release and a submission to a luarocks
> repository? I would like to ask people to try it with Sputnik, but
> without a rock this would be a little harder.
I'll look into releasing on luaforge. The project needs some polishing
first, e.g. better error handling and documentation.
> > Its main
> > advantages over the discount binding are portability and extensibility.
>
> Some documentation on how to extend it would be really helpful.
>
> In particular, if I wanted to extend it in such a way as to get a
> callback when a particular pattern (let's say "[[...]]") occurs in
> contexts other than code blocks, can this be done from outside the
> module?
No, currently you'd have to modify the module code. In the definition
of 'parser' in markdown_parser.lua, you'd add a clause for your new
pattern: something like
MyPattern = p"[[" * lpeg.Ct((_"Inline" - p"]]")^0) * p"]]" / writer.mypattern
(Note: p is a local abbreviation for lpeg.P, _ for lpeg.V.)
You'd add this to the list of Inline elements, before Link and Image.
Then you'd add a mypattern function to the table returned by 'writer' in
html_writer.lua (and any other writers you plan to use). This is your
callback. If you wanted the [[..]] to put a list of inline elements
inside <span> tags, you could do this:
mypattern = function(s) return {"<span>", s, "</span>"} end
The details really depend on what you want the [[...]] construct to
mean. Hope that's enough to get you going...
I want to think more about how to set things up so that custom parsers and
callbacks can be inserted without modifying the module code. That would
probably be a good feature.
John