Software / code / prosody-modules
Comparison
mod_conversejs/mod_conversejs.lua @ 3598:1921ae4449b8
mod_conversejs: Separate out templates into separate configurable files (breaks 0.9 compat)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 16 May 2019 08:45:41 +0200 |
| parent | 3494:4feab7e87675 |
| child | 3599:42fa833169bb |
comparison
equal
deleted
inserted
replaced
| 3597:da7ec4ed6ddf | 3598:1921ae4449b8 |
|---|---|
| 1 -- mod_conversejs | 1 -- mod_conversejs |
| 2 -- Copyright (C) 2017 Kim Alvefur | 2 -- Copyright (C) 2017 Kim Alvefur |
| 3 | 3 |
| 4 local json_encode = require"util.json".encode; | 4 local json_encode = require"util.json".encode; |
| 5 local xml_escape = require "util.stanza".xml_escape; | |
| 6 local render = require "util.interpolation".new("%b{}", xml_escape, { json = json_encode }); | |
| 5 | 7 |
| 6 module:depends"http"; | 8 module:depends"http"; |
| 7 | 9 |
| 8 local has_bosh = pcall(function () | 10 local has_bosh = pcall(function () |
| 9 module:depends"bosh"; | 11 module:depends"bosh"; |
| 22 local version = module:get_option_string("conversejs_version", ""); | 24 local version = module:get_option_string("conversejs_version", ""); |
| 23 if version ~= "" then version = "/" .. version end | 25 if version ~= "" then version = "/" .. version end |
| 24 local js_url = module:get_option_string("conversejs_script", cdn_url..version.."/dist/converse.min.js"); | 26 local js_url = module:get_option_string("conversejs_script", cdn_url..version.."/dist/converse.min.js"); |
| 25 local css_url = module:get_option_string("conversejs_css", cdn_url..version.."/css/converse.min.css"); | 27 local css_url = module:get_option_string("conversejs_css", cdn_url..version.."/css/converse.min.css"); |
| 26 | 28 |
| 27 local html_template = ([[ | 29 local html_template; |
| 28 <!DOCTYPE html> | |
| 29 <html> | |
| 30 <head> | |
| 31 <meta charset="utf-8"> | |
| 32 <link rel="stylesheet" type="text/css" media="screen" href="$css_url"/> | |
| 33 <script charset="utf-8" src="$js_url"></script> | |
| 34 <title>Prosody IM and Converse.js</title> | |
| 35 </head> | |
| 36 <body> | |
| 37 <noscript> | |
| 38 <h1>Converse.js</h1> | |
| 39 <p>I'm sorry, but this XMPP client application won't work without JavaScript.</p> | |
| 40 <p>Perhaps you would like to try one of these clients:</p> | |
| 41 <dl> | |
| 42 <dt>Desktop</dt> | |
| 43 <dd><ul> | |
| 44 <li><a href="https://gajim.org/">Gajim</a></li> | |
| 45 <li><a href="https://poez.io/">Poezio</a></li> | |
| 46 <li><a href="https://swift.im/">Swift</a></li> | |
| 47 </ul></dd> | |
| 48 <dt>Mobile</dt> | |
| 49 <dd><ul> | |
| 50 <li><a href="https://github.com/siacs/Conversations">Conversations</a></li> | |
| 51 <li><a href="https://yaxim.org/">Yaxim</a></li> | |
| 52 </ul></dd> | |
| 53 </dl> | |
| 54 <p><a href="https://xmpp.org/software/clients.html">More clients...</a></p> | |
| 55 </noscript> | |
| 56 <script>%s</script> | |
| 57 </body> | |
| 58 </html> | |
| 59 ]]):gsub("$([%w_]+)", { js_url = js_url, css_url = css_url }); | |
| 60 | 30 |
| 61 js_template = [[ | 31 do |
| 62 if(typeof converse == 'undefined') { | 32 local template_filename = module:get_option_string(module.name .. "_html_template", "template.html"); |
| 63 var div = document.createElement("div"); | 33 local template_file, err = module:load_resource(template_filename); |
| 64 var noscript = document.getElementsByTagName("noscript")[0]; | 34 if template_file then |
| 65 div.innerHTML = noscript.innerText; | 35 html_template, err = template_file:read("*a"); |
| 66 document.body.appendChild(div); | 36 template_file:close(); |
| 67 } else { | 37 end |
| 68 converse.initialize(%s); | 38 if not html_template then |
| 69 } | 39 module:log("error", "Error loading HTML template: %s", err); |
| 70 ]]; | 40 html_template = render("<h1>mod_{module} could not read the template</h1>\ |
| 41 <p>Tried to open <b>{filename}</b></p>\ | |
| 42 <pre>{error}</pre>", | |
| 43 { module = module.name, filename = template_filename, error = err }); | |
| 44 end | |
| 45 end | |
| 46 | |
| 47 local js_template; | |
| 48 do | |
| 49 local template_filename = module:get_option_string(module.name .. "_js_template", "template.js"); | |
| 50 local template_file, err = module:load_resource(template_filename); | |
| 51 if template_file then | |
| 52 js_template, err = template_file:read("*a"); | |
| 53 template_file:close(); | |
| 54 end | |
| 55 if not js_template then | |
| 56 module:log("error", "Error loading JS template: %s", err); | |
| 57 js_template = render("console.log(\"mod_{module} could not read the JS template: %s\", {error|json})", | |
| 58 { module = module.name, filename = template_filename, error = err }); | |
| 59 end | |
| 60 end | |
| 71 | 61 |
| 72 local user_options = module:get_option("conversejs_options"); | 62 local user_options = module:get_option("conversejs_options"); |
| 73 | 63 |
| 74 local function get_converse_options() | 64 local function get_converse_options() |
| 75 local allow_registration = module:get_option_boolean("allow_registration", false); | 65 local allow_registration = module:get_option_boolean("allow_registration", false); |
| 91 end | 81 end |
| 92 | 82 |
| 93 return converse_options; | 83 return converse_options; |
| 94 end | 84 end |
| 95 | 85 |
| 96 local add_tags = module:get_option_set("conversejs_tags"); | 86 local add_tags = module:get_option_array("conversejs_tags", {}); |
| 97 | |
| 98 if add_tags then | |
| 99 local tags = {}; | |
| 100 for tag in add_tags do | |
| 101 table.insert(tags, tag); | |
| 102 end | |
| 103 html_template = html_template:gsub("</head>", table.concat(tags, "\n"):gsub("%%", "%%").."\n</head>"); | |
| 104 end | |
| 105 | 87 |
| 106 module:provides("http", { | 88 module:provides("http", { |
| 107 title = "Converse.js"; | 89 title = "Converse.js"; |
| 108 route = { | 90 route = { |
| 109 GET = function (event) | 91 GET = function (event) |
| 110 local converse_options = get_converse_options(); | 92 local converse_options = get_converse_options(); |
| 111 | 93 |
| 112 event.response.headers.content_type = "text/html"; | 94 event.response.headers.content_type = "text/html"; |
| 113 return html_template:format(js_template:format(json_encode(converse_options))); | 95 return render(html_template, { |
| 96 header_scripts = { js_url }; | |
| 97 header_style = { css_url }; | |
| 98 header_tags = add_tags; | |
| 99 conversejs = { | |
| 100 options = converse_options; | |
| 101 startup = { script = js_template:format(json_encode(converse_options)); } | |
| 102 }; | |
| 103 }); | |
| 114 end; | 104 end; |
| 115 | 105 |
| 116 ["GET /prosody-converse.js"] = function (event) | 106 ["GET /prosody-converse.js"] = function (event) |
| 117 local converse_options = get_converse_options(); | 107 local converse_options = get_converse_options(); |
| 118 | 108 |