examples/x_data.lua
changeset 68 742878c74b8e
parent 67 d33ca5572e91
child 69 ab6d4ee8974c
--- a/examples/x_data.lua	Sat Mar 28 19:43:12 2009 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,226 +0,0 @@
-
--- DATA FORMS (XEP-0004)
-
--- library
-
-local form_field = require 'form_field'
-
---
-
-local F = { }
-local M = { }
-M.__index = M
-
--- form.new       -- new form
--- form.parse     -- parse existing form -- according to form type!
--- form:type      -- get type
--- form:desc      -- get title, instructions
--- form:format    -- format form -- according to form type!
--- form:fields    -- iterator, returns field objects
--- form:add       -- create field
--- form:field     -- get field
--- ?? form:del    -- delete field
--- field.new      -- create field
--- field:index    -- get index
--- field:type     -- get type
--- field:name     -- get var
--- field:desc     -- get label, desc
--- field:value    -- get/set value
--- field:values   -- get values
--- field:clear    -- clear value
--- field:options  -- get options
--- field:required -- get required
-
--- form    may have 'fixed' fields and should be ordered
--- submit  must not have 'fixed' fields and may be not ordered
--- cancel  must not have anything
--- result  should not have 'fixed', may be not ordered and can contain reported/item... multiple instances.
-
-function F.new ( args )
-	local form  = {
-		xmlns        = 'jabber:x:data',
-		ftype        = args.type or 'form',
-		title        = args.title,
-		instructions = args.instructions,
-		f            = { },
-	}
-	setmetatable ( form, M )
-	return form
-end
-
-function F.parse ( x )
-	local title = x:child ( 'title' )
-	if title then
-		title = title:value ()
-	end
-
-	local instructions = x:child ( 'instructions' )
-	if instructions then
-		instructions = instructions:value ()
-	end
-
-	local f = F.new { type = x:attribute ( 'type' ), title = title, instructions = instructions }
-
-	local field = x:child ()
-	while field do
-		local name = field:name ()
-		if name == 'field' then
-			local ftype = field:attribute ( 'type' ) or 'text-single'
-			local var   = field:attribute ( 'var' )
-			local r = {
-				type  = ftype,
-				label = field:attribute ( 'label' ),
-			}
-
-			local desc = field:child ( 'desc' )
-			if desc then
-				r.desc = desc:value ()
-			end
-
-			if field:child ( 'required' ) then
-				r.required = true
-			end
-
-			if ftype == 'jid-multi' or ftype == 'list-multi' or ftype == 'text-multi' or ftype == 'list-single' then
-				local values  = { }
-				local options = { }
-
-				local item = field:child ()
-				while item do
-					local name = item:name ()
-					if name == 'value' then
-						table.insert ( values, item:value () )
-					elseif name == 'option' then
-						options[item:child( 'value' ):value ()] = item:attribute ( 'label' ) or ''
-					end
-					item = item:next ()
-				end
-
-				if ftype == 'list-single' then
-					local value = field:child ( 'value' )
-					if value then
-						r.value = value:value ()
-					end
-				else
-					r.value = values
-				end
-
-				if ftype == 'list-multi' or ftype == 'list-single' then
-					r.options = options
-				end
-			else
-				local value = field:child ( 'value' )
-				if value then
-					r.value = value:value ()
-				end
-			end
-
-			f:add ( var, r )
-		end
-
-		field = field:next ()
-	end
-
-	return f
-end
-
-function M.type ( form )
-	return form.ftype
-end
-
-function M.desc ( form )
-	return form.title, form.instructions
-end
-
-function M.format ( form, root, format_as )
-	local ft = format_as or form:type ()
-
-	root.x = { xmlns = 'jabber:x:data', type = ft }
-
-	if ft == 'cancel' then
-		return root
-	end
-
-	if ft == 'form' then
-		local title, instructions = form:desc ()
-		if title then
-			root.x.title = { title }
-		end
-		if instructions then
-			root.x.instructions = { instructions }
-		end
-	end
-
-	local fields = { }
-	for i, field in form:fields () do
-		local ftype = field:type ()
-
-		local options, label, desc, required
-		if ft == 'form' then
-			label, desc = field:desc ()
-			if desc then
-				desc = { desc }
-			end
-
-			if field:required () then
-				required = { }
-			end
-		
-			for option, label in field:options () do
-				table.insert ( options, { label = label, value = { option } } )
-			end
-		end
-
-		local value
-		if ftype == 'list-multi' or ftype == 'text-multi' or ftype == 'jid-multi' then
-			if ft == 'form' then
-				for option, label in field:options () do
-					table.insert ( options, { label = label, value = { option } } )
-				end
-			end
-
-			value = { }
-			for j, v in ipairs ( field.value ) do
-				table.insert ( value, { v } )
-			end
-		else
-			value = { field:value () }
-		end
-
-		if ftype ~= 'fixed' or ft == 'form' then
-			table.insert ( fields, {
-					type   = ftype,
-					var    = field:name (),
-					label  = label,
-					desc   = desc,
-					value  = value,
-					option = options
-				} )
-		end
-	end
-	root.x.field = fields
-
-	return root
-end
-
-function M.fields ( form )
-	return ipairs ( form.f )
-end
-
-function M.add ( form, var, fld )
-	fld.var   = var
-	fld.index = #form.f + 1 -- XXX
-	local obj = form_field.new ( fld )
-	table.insert ( form.f, obj )
-	form.f[var] = obj
-	return obj
-end
-
-function M.field ( form, var )
-	-- works well on indices
-	return form.f[var]
-end
-
-return F
-
--- vim: se ts=4: --