[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: ANNOUNCE: lunamark - PEG-based markdown conversion library
- From: Jim Whitehead II <jnwhiteh@...>
- Date: Tue, 20 Oct 2009 12:47:06 +0100
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?
Thanks,
- Jim