Software /
code /
prosody-modules
Diff
mod_latex/mod_latex.lua @ 126:e190c1643a8f
mod_latex: New (well, kind of) module for rendering LaTeX in messages and replacing with a rendered embedded image
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 27 Jan 2010 20:50:52 +0000 |
child | 1343:7dbde05b48a9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_latex/mod_latex.lua Wed Jan 27 20:50:52 2010 +0000 @@ -0,0 +1,57 @@ +local st = require "stanza"; +local urlencode = require "net.http".urlencode; + +local xmlns_xhtmlim = "http://jabber.org/protocol/xhtml-im"; +local xmlns_xhtml = "http://www.w3.org/1999/xhtml"; + +local function replace_latex(data) + module:log("debug", "Replacing latex..."); + local origin, stanza = data.origin, data.stanza; + local body = stanza:child_with_name("body"); + if not body then return; end + + body = body:get_text(); + if not body:match("%$%$") then + return; + end + + local html = st.stanza("html", { xmlns = xmlns_xhtmlim }) + :tag("body", { xmlns = xmlns_xhtml }); + + local in_latex, last_char; + for snippet, up_to in body:gmatch("(.-)%$%$()") do + last_char = up_to; + if in_latex then + -- Render latex and add image, next snippet is text + in_latex = nil; + html:tag("img", { src = "http://www.mathtran.org/cgi-bin/mathtran?D=2;tex="..urlencode(snippet), alt = snippet }):up(); + else + -- Add text to HTML, next snippet is latex + in_latex = true; + html:tag("span"):text(snippet):up(); + + end + end + if last_char < #body then + html:tag("span"):text(body:sub(last_char, #body)):up(); + end + + for n, tag in ipairs(stanza.tags) do + module:log("debug", "Tag: %s|%s", tag.attr.xmlns or "", tag.name or ""); + if tag.name == "html" and tag.attr.xmlns == xmlns_xhtmlim then + stanza.tags[n] = html; + for n, child in ipairs(stanza) do + if child == tag then + stanza[n] = html; + end + end + return; + end + end + + stanza[#stanza+1] = html; + stanza.tags[#stanza.tags+1] = html; +end + +module:hook("message/bare", replace_latex, 30); +module:hook("message/full", replace_latex, 30);