+ if node and host then
+ return node.."@"..host;
+ end
+ return host;
+end
+
+local function prepped_split(jid)
+ local node, host, resource = split(jid);
+ if host then
+ if sub(host, -1, -1) == "." then -- Strip empty root label
+ host = sub(host, 1, -2);
+ end
+ host = nameprep(host);
+ if not host then return; end
+ if node then
+ node = nodeprep(node);
+ if not node then return; end
+ end
+ if resource then
+ resource = resourceprep(resource);
+ if not resource then return; end
+ end
+ return node, host, resource;
+ end
+end
+
+local function join(node, host, resource)
+ if not host then return end
+ if node and resource then
+ return node.."@"..host.."/"..resource;
+ elseif node then
+ return node.."@"..host;
+ elseif resource then
+ return host.."/"..resource;
+ end
+ return host;
+end
+
+local function prep(jid)
+ local node, host, resource = prepped_split(jid);
+ return join(node, host, resource);