[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: Thu, 29 Oct 2009 19:08:26 -0700
+++ Jim Whitehead II [Oct 20 09 12:47 ]:
> On Wed, Sep 16, 2009 at 7:36 AM, John MacFarlane <jgm@berkeley.edu> wrote:
> > +++ Yuri Takhteyev [Sep 14 09 11:12 ]:
> >> > I'll look into releasing on luaforge. The project needs some polishing
> >> > first, e.g. better error handling and documentation.
> >>
> >> It can always be made better, but please don't let this stop you from
> >> making a release.
> >
> > Okay, I've tagged 0.1 and made a rock available on github: you should
> > now be able to install the library using
> >
> > luarocks --from=http://github.com/jgm/rocks/raw/master install lunamark
> >
> >> > 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
> >>
> >> If this is the only thing that needs to be done, shouldn't it be easy
> >> to expose the table that is used to create the parser, to allow adding
> >> a pattern by simply setting a field? Perhaps something like:
> >>
> >> require("lunamark")
> >> require("lpeg")
> >> local wikilink_handler = function(s) return {"<span>", s, "</span>"} end
> >> my_parser = lunamark.parsers.markdown() -- or something similar
> >> my_parser.WikiLink = lpeg.P"[[" * lpeg.Ct((_"Inline" -
> >> lpeg.P"]]")^0) * lpeg.P"]]" / wikilink_handler
> >> local converter = lunamark.converter(my_parser, "html")
> >
> > Good thought. I've done something similar. You can now pass in a
> > modify_syntax function as an option. This is a function from a table
> > to a table, so you can perform arbitrary transformations on the input
> > format grammar. A simple example:
> >
> > function capify(t)
> > t.Str = t.Str / string.upper
> > return t
> > end
> >
> > markdown2htmlCAPS = lunamark.converter("markdown", "html", { modify_syntax = capify })
> >
> > This gives you a markdown variant in which all strings are capitalized.
> >
> > Adding a handler for, say, wikilinks would be slightly more complicated.
> > You'd have to do two things to the grammar table:
> > (1) insert an entry for WikiLink
> > (2) register WikiLink as an Inline element by modifying Inline
> >
> > So, something like this:
> >
> > function add_wikilink(t)
> > t.WikiLink = --[[ whatever... ]] / write_wikilink
> > t.Inline = lpeg.V("WikiLink") + t.Inline
> > return t
> > end
> >
> > function write_wikilink(s)
> > -- code to write the wikilink as HTML
> > end
>
> I took a stab at implementing this, and I got wiki links working
> perfectly. I had a question about how I would accomplish something
> else, however, since its a bit of a weird need. I'd like for any
> special characters (gt, lt, quot) to be escaped when they aren't
> encountered in an inline code element, or a verbatim block. I tried
> altering the grammar to get it to work, but every attempt has failed
> miserably. Any idea how I would do something like that, John?
>
I'm not sure what you mean by "escaped." These characters are already
escaped in HTML output; that is, < goes to <, " to ", etc.
Do you mean that you want these NOT to be escaped when they occur in
inline code or verbatim? Or do you mean that you want them to be
escaped in some other way?
Since you're dealing with the HTML output here, you probably want to
be modifying the writer (lunamark/writer/html.lua), not the grammar.
John