1 2.. index:: Field Modifiers 3.. _field-modifiers: 4 5Field Modifiers 6~~~~~~~~~~~~~~~ 7 8Field modifiers are flags which modify the way content emitted for 9particular output styles: 10 11=== =============== =================================================== 12 M Name Description 13=== =============== =================================================== 14 a argument The content appears as a 'const char \*' argument 15 c colon A colon (":") is appended after the label 16 d display Only emit field for display styles (text/HTML) 17 e encoding Only emit for encoding styles (XML/JSON) 18 g gettext Call gettext on field's render content 19 h humanize (hn) Format large numbers in human-readable style 20\ hn-space Humanize: Place space between numeric and unit 21\ hn-decimal Humanize: Add a decimal digit, if number < 10 22\ hn-1000 Humanize: Use 1000 as divisor instead of 1024 23 k key Field is a key, suitable for XPath predicates 24 l leaf-list Field is a leaf-list 25 n no-quotes Do not quote the field when using JSON style 26 p plural Gettext: Use comma-separated plural form 27 q quotes Quote the field when using JSON style 28 t trim Trim leading and trailing whitespace 29 w white A blank (" ") is appended after the label 30=== =============== =================================================== 31 32Roles and modifiers can also use more verbose names, when preceded by 33a comma. For example, the modifier string "Lwc" (or "L,white,colon") 34means the field has a label role (text that describes the next field) 35and should be followed by a colon ('c') and a space ('w'). The 36modifier string "Vkq" (or ":key,quote") means the field has a value 37role (the default role), that it is a key for the current instance, 38and that the value should be quoted when encoded for JSON. 39 40.. index:: Field Modifiers; Argument 41.. _argument-modifier: 42 43The Argument Modifier ({a:}) 44++++++++++++++++++++++++++++ 45 46.. index:: Field Modifiers; Argument 47 48The argument modifier indicates that the content of the field 49descriptor will be placed as a UTF-8 string (const char \*) argument 50within the xo_emit parameters:: 51 52 EXAMPLE: 53 xo_emit("{La:} {a:}\n", "Label text", "label", "value"); 54 TEXT: 55 Label text value 56 JSON: 57 "label": "value" 58 XML: 59 <label>value</label> 60 61The argument modifier allows field names for value fields to be passed 62on the stack, avoiding the need to build a field descriptor using 63snprintf. For many field roles, the argument modifier is not needed, 64since those roles have specific mechanisms for arguments, such as 65"{C:fg-%s}". 66 67.. index:: Field Modifiers; Colon 68.. _colon-modifier: 69 70The Colon Modifier ({c:}) 71+++++++++++++++++++++++++ 72 73.. index:: Field Modifiers; Colon 74 75The colon modifier appends a single colon to the data value:: 76 77 EXAMPLE: 78 xo_emit("{Lc:Name}{:name}\n", "phil"); 79 TEXT: 80 Name:phil 81 82The colon modifier is only used for the TEXT and HTML output 83styles. It is commonly combined with the space modifier ('{w:}'). 84It is purely a convenience feature. 85 86.. index:: Field Modifiers; Display 87.. _display-modifier: 88 89The Display Modifier ({d:}) 90+++++++++++++++++++++++++++ 91 92.. index:: Field Modifiers; Display 93 94The display modifier indicated the field should only be generated for 95the display output styles, TEXT and HTML:: 96 97 EXAMPLE: 98 xo_emit("{Lcw:Name}{d:name} {:id/%d}\n", "phil", 1); 99 TEXT: 100 Name: phil 1 101 XML: 102 <id>1</id> 103 104The display modifier is the opposite of the encoding modifier, and 105they are often used to give to distinct views of the underlying data. 106 107.. index:: Field Modifiers; Encoding 108.. _encoding-modifier: 109 110The Encoding Modifier ({e:}) 111++++++++++++++++++++++++++++ 112 113.. index:: Field Modifiers; Encoding 114 115The display modifier indicated the field should only be generated for 116the display output styles, TEXT and HTML:: 117 118 EXAMPLE: 119 xo_emit("{Lcw:Name}{:name} {e:id/%d}\n", "phil", 1); 120 TEXT: 121 Name: phil 122 XML: 123 <name>phil</name><id>1</id> 124 125The encoding modifier is the opposite of the display modifier, and 126they are often used to give to distinct views of the underlying data. 127 128.. index:: Field Modifiers; Gettext 129.. _gettext-modifier: 130 131The Gettext Modifier ({g:}) 132+++++++++++++++++++++++++++ 133 134.. index:: Field Modifiers; Gettext 135.. index:: gettext 136 137The gettext modifier is used to translate individual fields using the 138gettext domain (typically set using the "`{G:}`" role) and current 139language settings. Once libxo renders the field value, it is passed 140to gettext(3), where it is used as a key to find the native language 141translation. 142 143In the following example, the strings "State" and "full" are passed 144to gettext() to find locale-based translated strings:: 145 146 xo_emit("{Lgwc:State}{g:state}\n", "full"); 147 148See :ref:`gettext-role`, :ref:`plural-modifier`, and 149:ref:`i18n` for additional details. 150 151.. index:: Field Modifiers; Humanize 152.. _humanize-modifier: 153 154The Humanize Modifier ({h:}) 155++++++++++++++++++++++++++++ 156 157.. index:: Field Modifiers; Humanize 158 159The humanize modifier is used to render large numbers as in a 160human-readable format. While numbers like "44470272" are completely 161readable to computers and savants, humans will generally find "44M" 162more meaningful. 163 164"hn" can be used as an alias for "humanize". 165 166The humanize modifier only affects display styles (TEXT and HMTL). 167The "`no-humanize`" option (See :ref:`options`) will block 168the function of the humanize modifier. 169 170There are a number of modifiers that affect details of humanization. 171These are only available in as full names, not single characters. The 172"`hn-space`" modifier places a space between the number and any 173multiplier symbol, such as "M" or "K" (ex: "44 K"). The 174"`hn-decimal`" modifier will add a decimal point and a single tenths 175digit when the number is less than 10 (ex: "4.4K"). The "`hn-1000`" 176modifier will use 1000 as divisor instead of 1024, following the 177JEDEC-standard instead of the more natural binary powers-of-two 178tradition:: 179 180 EXAMPLE: 181 xo_emit("{h:input/%u}, {h,hn-space:output/%u}, " 182 "{h,hn-decimal:errors/%u}, {h,hn-1000:capacity/%u}, " 183 "{h,hn-decimal:remaining/%u}\n", 184 input, output, errors, capacity, remaining); 185 TEXT: 186 21, 57 K, 96M, 44M, 1.2G 187 188In the HTML style, the original numeric value is rendered in the 189"data-number" attribute on the <div> element:: 190 191 <div class="data" data-tag="errors" 192 data-number="100663296">96M</div> 193 194.. index:: Field Modifiers; Key 195.. _key-modifier: 196 197The Key Modifier ({k:}) 198+++++++++++++++++++++++ 199 200.. index:: Field Modifiers; Key 201 202The key modifier is used to indicate that a particular field helps 203uniquely identify an instance of list data:: 204 205 EXAMPLE: 206 xo_open_list("user"); 207 for (i = 0; i < num_users; i++) { 208 xo_open_instance("user"); 209 xo_emit("User {k:name} has {:count} tickets\n", 210 user[i].u_name, user[i].u_tickets); 211 xo_close_instance("user"); 212 } 213 xo_close_list("user"); 214 215.. index:: XOF_XPATH 216 217Currently the key modifier is only used when generating XPath value 218for the HTML output style when XOF_XPATH is set, but other uses are 219likely in the near future. 220 221.. index:: Field Modifiers; Leaf-List 222.. _leaf-list: 223 224The Leaf-List Modifier ({l:}) 225+++++++++++++++++++++++++++++ 226 227.. index:: Field Modifiers; Leaf-List 228 229The leaf-list modifier is used to distinguish lists where each 230instance consists of only a single value. In XML, these are 231rendered as single elements, where JSON renders them as arrays:: 232 233 EXAMPLE: 234 for (i = 0; i < num_users; i++) { 235 xo_emit("Member {l:user}\n", user[i].u_name); 236 } 237 XML: 238 <user>phil</user> 239 <user>pallavi</user> 240 JSON: 241 "user": [ "phil", "pallavi" ] 242 243The name of the field must match the name of the leaf list. 244 245.. index:: Field Modifiers; No-Quotes 246.. _no-quotes-modifier: 247 248The No-Quotes Modifier ({n:}) 249+++++++++++++++++++++++++++++ 250 251.. index:: Field Modifiers; No-Quotes 252 253The no-quotes modifier (and its twin, the 'quotes' modifier) affect 254the quoting of values in the JSON output style. JSON uses quotes for 255string value, but no quotes for numeric, boolean, and null data. 256xo_emit applies a simple heuristic to determine whether quotes are 257needed, but often this needs to be controlled by the caller:: 258 259 EXAMPLE: 260 const char *bool = is_true ? "true" : "false"; 261 xo_emit("{n:fancy/%s}", bool); 262 JSON: 263 "fancy": true 264 265.. index:: Field Modifiers; Plural 266.. _plural-modifier: 267 268The Plural Modifier ({p:}) 269++++++++++++++++++++++++++ 270 271.. index:: Field Modifiers; Plural 272.. index:: gettext 273 274The plural modifier selects the appropriate plural form of an 275expression based on the most recent number emitted and the current 276language settings. The contents of the field should be the singular 277and plural English values, separated by a comma:: 278 279 xo_emit("{:bytes} {Ngp:byte,bytes}\n", bytes); 280 281The plural modifier is meant to work with the gettext modifier ({g:}) 282but can work independently. See :ref:`gettext-modifier`. 283 284When used without the gettext modifier or when the message does not 285appear in the message catalog, the first token is chosen when the last 286numeric value is equal to 1; otherwise the second value is used, 287mimicking the simple pluralization rules of English. 288 289When used with the gettext modifier, the ngettext(3) function is 290called to handle the heavy lifting, using the message catalog to 291convert the singular and plural forms into the native language. 292 293.. index:: Field Modifiers; Quotes 294.. _quotes-modifier: 295 296The Quotes Modifier ({q:}) 297++++++++++++++++++++++++++ 298 299.. index:: Field Modifiers; Quotes 300 301The quotes modifier (and its twin, the 'no-quotes' modifier) affect 302the quoting of values in the JSON output style. JSON uses quotes for 303string value, but no quotes for numeric, boolean, and null data. 304xo_emit applies a simple heuristic to determine whether quotes are 305needed, but often this needs to be controlled by the caller:: 306 307 EXAMPLE: 308 xo_emit("{q:time/%d}", 2014); 309 JSON: 310 "year": "2014" 311 312The heuristic is based on the format; if the format uses any of the 313following conversion specifiers, then no quotes are used:: 314 315 d i o u x X D O U e E f F g G a A c C p 316 317.. index:: Field Modifiers; Trim 318.. _trim-modifier: 319 320The Trim Modifier ({t:}) 321++++++++++++++++++++++++ 322 323.. index:: Field Modifiers; Trim 324 325The trim modifier removes any leading or trailing whitespace from 326the value:: 327 328 EXAMPLE: 329 xo_emit("{t:description}", " some input "); 330 JSON: 331 "description": "some input" 332 333.. index:: Field Modifiers; White Space 334.. _white-space-modifier: 335 336The White Space Modifier ({w:}) 337+++++++++++++++++++++++++++++++ 338 339.. index:: Field Modifiers; White Space 340 341The white space modifier appends a single space to the data value:: 342 343 EXAMPLE: 344 xo_emit("{Lw:Name}{:name}\n", "phil"); 345 TEXT: 346 Name phil 347 348The white space modifier is only used for the TEXT and HTML output 349styles. It is commonly combined with the colon modifier ('{c:}'). 350It is purely a convenience feature. 351 352Note that the sense of the 'w' modifier is reversed for the units role 353({Uw:}); a blank is added before the contents, rather than after it. 354