Software / code / prosody
Comparison
util/datamapper.lua @ 11437:87a684df4b65
util.datamapper: Invent extension for using tag name as value
Useful for certain enum-like uses where the element name is the relevant
information, e.g. chat states.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 06 Mar 2021 23:14:23 +0100 |
| parent | 11436:5df9ffc25bb4 |
| child | 11438:b7807583de34 |
comparison
equal
deleted
inserted
replaced
| 11436:5df9ffc25bb4 | 11437:87a684df4b65 |
|---|---|
| 16 local name = prop | 16 local name = prop |
| 17 local namespace = s.attr.xmlns; | 17 local namespace = s.attr.xmlns; |
| 18 local prefix = nil | 18 local prefix = nil |
| 19 local is_attribute = false | 19 local is_attribute = false |
| 20 local is_text = false | 20 local is_text = false |
| 21 local name_is_value = false; | |
| 21 | 22 |
| 22 local proptype | 23 local proptype |
| 23 if type(propschema) == "table" then | 24 if type(propschema) == "table" then |
| 24 proptype = propschema.type | 25 proptype = propschema.type |
| 25 elseif type(propschema) == "string" then | 26 elseif type(propschema) == "string" then |
| 38 end | 39 end |
| 39 if propschema.xml.attribute then | 40 if propschema.xml.attribute then |
| 40 is_attribute = true | 41 is_attribute = true |
| 41 elseif propschema.xml.text then | 42 elseif propschema.xml.text then |
| 42 is_text = true | 43 is_text = true |
| 43 end | 44 elseif propschema.xml.x_name_is_value then |
| 44 end | 45 name_is_value = true |
| 45 | 46 end |
| 46 if is_attribute then | 47 end |
| 48 | |
| 49 if name_is_value then | |
| 50 local c = s:get_child(nil, namespace); | |
| 51 if c then | |
| 52 out[prop] = c.name; | |
| 53 end | |
| 54 elseif is_attribute then | |
| 47 local attr = name | 55 local attr = name |
| 48 if prefix then | 56 if prefix then |
| 49 attr = prefix .. ":" .. name | 57 attr = prefix .. ":" .. name |
| 50 elseif namespace ~= s.attr.xmlns then | 58 elseif namespace ~= s.attr.xmlns then |
| 51 attr = namespace .. "\1" .. name | 59 attr = namespace .. "\1" .. name |
| 122 local name = prop | 130 local name = prop |
| 123 local namespace = current_ns | 131 local namespace = current_ns |
| 124 local prefix = nil | 132 local prefix = nil |
| 125 local is_attribute = false | 133 local is_attribute = false |
| 126 local is_text = false | 134 local is_text = false |
| 135 local name_is_value = false; | |
| 127 | 136 |
| 128 if type(propschema) == "table" and propschema.xml then | 137 if type(propschema) == "table" and propschema.xml then |
| 129 | 138 |
| 130 if propschema.xml.name then | 139 if propschema.xml.name then |
| 131 name = propschema.xml.name | 140 name = propschema.xml.name |
| 140 | 149 |
| 141 if propschema.xml.attribute then | 150 if propschema.xml.attribute then |
| 142 is_attribute = true | 151 is_attribute = true |
| 143 elseif propschema.xml.text then | 152 elseif propschema.xml.text then |
| 144 is_text = true | 153 is_text = true |
| 154 elseif propschema.xml.x_name_is_value then | |
| 155 name_is_value = true | |
| 145 end | 156 end |
| 146 end | 157 end |
| 147 | 158 |
| 148 if is_attribute then | 159 if is_attribute then |
| 149 local attr = name | 160 local attr = name |
| 169 else | 180 else |
| 170 local propattr | 181 local propattr |
| 171 if namespace ~= current_ns then | 182 if namespace ~= current_ns then |
| 172 propattr = {xmlns = namespace} | 183 propattr = {xmlns = namespace} |
| 173 end | 184 end |
| 174 if proptype == "string" and type(v) == "string" then | 185 if name_is_value and type(v) == "string" then |
| 186 out:tag(v, propattr):up(); | |
| 187 elseif proptype == "string" and type(v) == "string" then | |
| 175 out:text_tag(name, v, propattr) | 188 out:text_tag(name, v, propattr) |
| 176 elseif proptype == "number" and type(v) == "number" then | 189 elseif proptype == "number" and type(v) == "number" then |
| 177 out:text_tag(name, string.format("%g", v), propattr) | 190 out:text_tag(name, string.format("%g", v), propattr) |
| 178 elseif proptype == "integer" and type(v) == "number" then | 191 elseif proptype == "integer" and type(v) == "number" then |
| 179 out:text_tag(name, string.format("%d", v), propattr) | 192 out:text_tag(name, string.format("%d", v), propattr) |