Software /
code /
prosody-modules
File
mod_http_index/mod_http_index.lua @ 1825:1b5c817cb642
mod_http_index: Update to use util.interpolation (makes it depend on 0.10+)
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 04 Sep 2015 00:10:51 +0200 |
parent | 1573:0d8cc6971cdb |
child | 1826:ae2235d6c3f8 |
line wrap: on
line source
local url = require"socket.url"; local render = require"util.interpolation".new("%b{}", require"util.stanza".xml_escape); module:depends"http"; -- TODO Move templates into files local base_template = [[ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="generator" value="prosody/{prosody_version} mod_{mod_name}"> <link rel="canonical" href="{canonical}"> <title>{title}</title> <style> body{background-color:#eeeeec;margin:1ex 0;padding-bottom:3em;font-family:Arial,Helvetica,sans-serif;} header,footer{margin:1ex 1em;} footer{font-size:smaller;color:#babdb6;} .content{background-color:white;padding:1em;list-style-position:inside;} nav{font-size:large;margin:1ex 1ex;clear:both;line-height:1.5em;} nav a{padding: 1ex;text-decoration:none;} nav a[rel="up"]{font-size:smaller;} nav a[rel="prev"]{float:left;} nav a[rel="next"]{float:right;} nav a[rel="next::after"]{content:" →";} nav a[rel="prev::before"]{content:"← ";} nav a:empty::after,nav a:empty::before{content:""} @media screen and (min-width: 460px) { nav{font-size:x-large;margin:1ex 1em;} } a:link,a:visited{color:#2e3436;text-decoration:none;} a:link:hover,a:visited:hover{color:#3465a4;} ul,ol{padding:0;} li{list-style:none;} hr{visibility:hidden;clear:both;} br{clear:both;} li time{float:right;font-size:small;opacity:0.2;} li:hover time{opacity:1;} .room-list .description{font-size:smaller;} q.body::before,q.body::after{content:"";} .presence .verb{font-style:normal;color:#30c030;} .presence.unavailable .verb{color:#c03030;} </style> </head> <body> <header> <h1>{title}</h1> </header> <hr> <div class="content"> <nav> <ul>{items# <li><a href="{item.url}" title="{item.module}">{item.name}</a></li>} </ul> </nav> </div> <hr> <footer> <br> <div class="powered-by">Prosody {prosody_version?}</div> </footer> </body> </html> ]]; local canonical = module:http_url(nil, "/"); local function relative(base, link) base = url.parse(base); link = url.parse(link); for k,v in pairs(base) do if link[k] == v then link[k] = nil; end end return url.build(link); end local function handler(event) local host_items = module:get_host_items("http-provider"); local http_apps = {} for _, item in ipairs(host_items) do if module.name ~= item._provided_by then table.insert(http_apps, { name = item.name; module = "mod_" .. item._provided_by; url = relative(canonical, module:http_url(item.name, item.default_path)); }); end end event.response.headers.content_type = "text/html"; return render(base_template, { title = "HTTP Apps"; items = http_apps; prosody_version = prosody.version; mod_name = module.name; canonical = canonical; }); end module:provides("http", { route = { ["GET /"] = handler; }; default_path = "/"; });