Value Class Pattern

(Redirected from vcp)

Jump to: navigation, search


The value class pattern is a set of ways to markup the value of a microformats property in part of an element, a title attribute, or across multiple elements.

Editors
Ben Ward
Tantek Çelik
Short URL
http://ufs.cc/w/vcp

Use the value class pattern when you need to markup:

  1. Only part of an element's content as the value of a property
  2. The displayed value written a certain way for design reasons, and a more universal value in the title attribute of an element
  3. Multiple elements that need to be combined to set the value of a property

For these purposes, the special class name value is used to mark-up the relevant data excerpt from larger element content.

Contents

Status

The value-class-pattern is feature complete, ready for use in markup, and supported in implementations such as search engines, parsers, and Firefox Operator. H2VX supports date and time separation but not value-title. See also the blog announcement.

Simple Examples

Here is markup for a home phone number:

vCard fragment:

TEL;TYPE=HOME:+1.415.555.1212

hCard fragment:

<span class="tel">
  <span class="type">Home</span>:
  <span class="value">+1.415.555.1212</span>
</span>

In this case, the value of tel is +1.415.555.1212, not Home: +1.415.555.1212.

Sometimes the value for a microformats property must be split into multiple pieces in the content of the element representing that property. Multiple elements with a class name of "value" (value elements) can be used to extract and concatenate these pieces into a single value for microformats properties which expect simple strings or tel values.

Another example, this time using a localized (British) telephone number:

<span class="tel">
  <span class="type">Home</span>:
  <span class="value">+44</span> (0) <span class="value">1223 123 123</span>
</span>

In this case, the valid data for the telephone number is +441223123123, but the way in which phone number is presented in Britain will include the (0), for local dialling. That is, from anywhere in the world you may dial +441223123123, or from within Britain you may dial 01223123123. Common local publishing interferes with the data, since dialling +4401223123123 is an invalid number.

In the mark-up, two value classes target the part of the telephone number string that makes an international, valid number, whilst allowing conventional presentation.

Another example, adding a place name to a geo co-ordinate:

<p>I'm loitering outside The Bricklayer's Arms
  <span class="geo">
    51° 30' 48.45", -0° 8' 53.23"
    (<span class="value">51.513458;-0.14812</span>)
  </span>
</p>

Whilst the entire string is a geo point, it's only the decimal encoded co-ordinates which must be consumed by a microformats parser, so the value class isolates it from the degrees form, which the publisher includes for completeness.

Basic Parsing

  1. The value class pattern only applies to properties which are simple strings, enumerated values, telephone numbers, and datetimes. The value class pattern does not affect parsing of properties of type email, URL, URI, UID.
  2. Where an element with such a microformat property class name has a descendant with class name value (a "value element") not inside some other property element, parsers should use the following portion of that value element:
    1. if the value element is an img or area element, then use the element's alt attribute value.
    2. if the value element is a data element, then use the element's value attribute value if present, otherwise its inner-text.
    3. if the value element is an abbr element, then use the element's title attribute value if present, otherwise its inner-text.
    4. for any other element, use its inner-text.
  3. Where there are multiple descendants of a property with class name of value (multiple value elements)
    1. if the microformats property expects a simple string, enumerated value, or telephone number, then the values extracted from the value elements should be concatenated without inserting additional characters or white-space.
    2. if the microformats property expects a datetime value, see the Date Time Parsing section.
  4. Descendants with class of value must not be parsed deeper than one level. That is, where an element foo with class value has a descendant bar with class value, the content of foo is taken as the value. Nesting additional elements with class of value cannot be used to further isolate a property's value.

e.g.

<p class="description">
  <span class="value">
    <em class="value">Puppies Rule!</em>
    <strong>But kittens are better!</strong>
 </span>
</p>

In this example, description has a child ‘value’, and that child has a grandchildvalue’. However, the parsing of value classes stops at the first level, so the data for description is: <em class="value">Puppies Rule!</em><strong>But kittens are better!</strong>, not just Puppies Rule!.


Date and time values

Summary

Some microformats properties expect an ISO8601 datetime value, e.g. hCalendar dtstart and dtend, hAtom published and updated, and all microformats2 dt-* properties.

Authors may use the value class pattern to separately specify the date and the time, which are then combined to specify a single datetime value.

Example, this hCalendar 'dtstart' property with 'value' elements:

<p>The weekly dinner will be on 
    <span class="dtstart">
        <time class="value" datetime="2008-06-24">this Tuesday</time> 
     at <time class="value">18:30</time>
    </span>
</p>

Alternatively, if you're not able to use the HTML5 <time> element:

<p>The weekly dinner will be on 
    <span class="dtstart">
        <abbr class="value" title="2008-06-24">this Tuesday</abbr> 
     at <span class="value">18:30</span>
    </span>
</p>

both produce the following 'dtstart' value:

2008-06-24T18:30:00

and iCalendar converters produce the following DTSTART:

DTSTART:20080624T183000

The lack of a timezone indicates a "floating" datetime, that is a datetime independent of any particular timezone. Examples of floating datetimes could be an alarm clock you set to ring at 7am, or the common 9am-5pm workday.

Date and time parsing

For all date time properties (as defined in their respective microformats specifications), the following rules apply in addition to (and in some cases replacing) the above value class pattern parsing rules.

When a "value element" is found, parse a value from the element as follows:

If by parsing the "value" element(s), at least a specific date has been found, then the "value" is overall valid, and the parser assembles the overall datetime value by concatenating the specific date, "T" and specific time (if time was specified, with 00 seconds implied if no seconds are provided), and specific timezone (if timezone and a specific time was specified).

format specific details

The following are format specific details and optimizations that make use of the value-class-pattern.

short URL for this section
http://ufs.cc/w/vcpfso

hCalendar dtend implied date

Typically events that start and end the same day only display the date of the event once (makes sense per the DRY principle) (real world examples: Upcoming, ... more examples with URLs would help for thoroughness).

Thus it would be convenient if we could imply an hCalendar event "dtend" date from its "dtstart" date when only the time (and optionally timezone) was specified for its "dtend", e.g.:

<span class="vevent">
 The <span class="summary">party</span> will be on 
 <span class="dtstart">
  <time class="value">2009-06-26</time>, from
  <time class="value">19:00</time></span> to 
 <span class="dtend"><time class="value">22:00</time></span>.
</span>

and in HTML4/XHTML1:

<span class="vevent">
 The <span class="summary">party</span> will be on 
 <span class="dtstart">
  <span class="value">2009-06-26</span>, from
  <span class="value">19:00</span></span> to 
 <span class="dtend"><span class="value">22:00</span></span>.
</span>

To simplify this further for authors, hCalendar processors could treat the specifying of just the time per the value-class-pattern date and time value rules, and thus eliminate the need for the "value" span inside the "dtend" span:

<span class="vevent">
 The <span class="summary">party</span> will be on 
 <span class="dtstart">
  <time class="value">2009-06-26</time>, from
  <time class="value">19:00</time></span> to 
 <time class="dtend">22:00</time>.
</span>

and in HTML4/XHTML1:

<span class="vevent">
 The <span class="summary">party</span> will be on 
 <span class="dtstart">
  <span class="value">2009-06-26</span>, from
  <span class="value">19:00</span></span> to 
 <span class="dtend">22:00</span>.
</span>

hCalendar to iCalendar converters should produce the following iCalendar fragment (as part of a valid .ics file) from all of the above four examples:

BEGIN:VEVENT
SUMMARY:party
DTSTART:20090626T190000
DTEND:20090626T220000
END:VEVENT

Implementations:

Examples "in the wild":

iCalendar generators

microformats implementations which consume hCalendar and generate iCalendar MUST in addition:

  1. remove any dash "-" separators in the date.
  2. remove any colon ":" separators in the time.
  3. add a whole day to any date-only (lacking a specified time) (date inclusive) hCalendar dtend property values in order to generate an (date exclusive) iCalendar DTEND property value with the same meaning, per the resolution to the dtend-issue.
  4. perform datetime math on any +/- relative timezone value, and produce an effective UTC value ending with "Z".

hAtom updated implied date

Similarly, in blog posts that indicate both when they were "published" and "updated", the date is usually only displayed once, typically when "published" (real world examples with URLs would help for thoroughness).

Thus it would be convenient if we could imply an hAtom entry "updated" date from its "published" date when only the time (and optionally timezone) was specified for its "updated", e.g. for a blog post that was updated the same day:

<span class="hentry">
 <span class="entry-summary">short blog post example</span>
 was published on <span class="published">
  <time class="value">2009-08-01</time> at <time class="value">12:06</time></span>
 and updated at <span class="updated"><time class="value">12:10</time></span>.
</span>

and in HTML4/XHTML1:

<span class="hentry">
 <span class="entry-summary">short blog post example</span>
 was published on <span class="published">
  <span class="value">2009-08-01</span> at <span class="value">12:06</span></span>
 and updated at <span class="updated"><span class="value">12:10</span></span>.
</span>

To simplify this further for authors, hAtom processors could treat the specifying of just the time per the value-class-pattern date and time value rules, and thus eliminate the need for the "value" span inside the "updated" span:

<span class="hentry">
 <span class="entry-summary">short blog post example</span>
 was published on <span class="published">
  <time class="value">2009-08-01</time> at <time class="value">12:06</time></span>
 and updated at <time class="updated">12:10</time>.
</span>

and in HTML4/XHTML1:

<span class="hentry">
 <span class="entry-summary">short blog post example</span>
 was published on <span class="published">
  <span class="value">2009-08-01</span> at <span class="value">12:06</span></span>
 and updated at <span class="updated">12:10</span>.
</span>

Atom generators

microformats implementations which consume hAtom and generate Atom MUST in addition:

microformats2 parsers

Proposal 2012-283:

Since microformats2 parsers are generic, instead of checking for specific properties (as above for hAtom and hCalendar), they may perform the following algorithm to imply dates for dt-* properties:

This should result in a similar enough implementation/interpretation as the previous vocabulary dependent heuristics for hAtom and hCalendar that a microformats2 parser could produce similar results for h-entry and h-event without having to know about their specific dt-* properties.

derivation and tests

This section is informative.

The handling of date and time values in the value class pattern was originally brainstormed on the value-excerption-pattern-brainstorming page and derived from that analysis and feedback. For the curious, historical details may be found there, along with additional thoughts for extension.

See value-class-date-time-tests for test cases.

Parsing value from a title attribute

The value-title class name allows the publisher to indicate the data value for a parent property is contained in the title attribute of an element, rather than the inner-text.

This can be used to provide a synonym within content, or used to quietly publish alternate forms of information for microformats parsing, without affecting the consumption of content.

For example, you can use casual localization with dates:

<p>It was 
 <span class='dtstart'>
  <span class='value-title' title='2008'>last year</span>
 </span>
  that I realised my addiction to cashew nuts would cost this country so dear.
</p>

Parsing rules for value-title are the same as for value above, with the following change:

Using value-title to publish machine-data

The initial usage of value-title is used to publish alternate, parsable forms of property values in a visible context without the use of the abbr element whose semantics already support interpretation of the 'title' attribute as an expanded, more precise form of the content.

Experience has found that there are some cases in microformats where a number of publishers want to include a precisely accurate and parsable value for a property but do not want it to be visible in their page, even as a tooltip.

For example, full ISO8601 datetimes may be confusing to readers of the page (as a tooltip or when read aloud by a screen reader), and enumerated values such as the type subproperty of hCard's tel property use US-English terms, which are not part of pages in any other language.

Since both of those scenarios have shown to be obstacles for a number of publishers, for these cases, and these alone, there exists a further extension of value-excerption. This extension allows the parsable form of the property to be published ‘silently’ in an empty element immediately adjacent with the respective local visible content.

Here is an example, with the required use of a first child element with class name value-title:

<p class='tel' lang='en-gb'>
  <span class='type'>
    <span class='value-title' title='cell'> </span>
    mobile
  </span>
  <span class='value'>+44 7773 000 000</span>
</p>

Note: the <span class='value-title' title='cell'> </span> span is deliberately empty (just has a space between the open and close tags) so that it doesn't take up any space and therefore can't show a tooltip.

The cell value is parsed for the 'type' subproperty, but mobile is presented to the user.

In the case of dates:

<p class='dtstart'>
  <span class='value-title' title='2009-03-14T16:28-0600'> </span>
  March 14th 2009, around half-past four
</p>

A microformats parser will read the ISO8601 format datetime 2009-03-14T16:28-0600, but users will only see March 14th 2009, around half-past four. Testing has shown that the ISO8601 datetime above does not get exposed to any user at all.

Parsing machine-data value-title

Browsers collapse the value-title span down to a width of 0, effectively providing no visual rendering, whilst keeping the element in the DOM. With no physical dimensions, there is no ‘hover’ state, so no tooltip is revealed. Furthermore, the empty element is not passed to assistive technology layers such as VoiceOver. Screen readers do not read the contents of the title attribute of an empty span element.

We conducted thorough testing of these parsing behaviors to ensure accessibility.

Note: Whilst the value-title element is more gracefully written without whitespace inner-text (or as self-closing <foo /> element in XHTML), some tools such as WYSIWYG editors and HTML-Tidy will erroneously discard such elements, resulting in parsable data being thrown away by some tools. As such, <span class='value-title'> </span>, including a single whitespace character between the opening and closing tag, may also be used. In some situations, this whitespace may be rendered by the browser, and authors should test their output.

Parsing this final value-title extension imposes some stricter restrictions on usage. These restrictions exist to reduce the impact of DRY violations, reduce the opportunity for sites to spoof data, and encourage best practice for maintaining both forms of data accurately.

Where an element with class value-title is to be parsed as data for a property, and that element also contains no non-whitespace content (hereafter referred to as ‘empty’), the following rules apply:

limited use of value-title

Due to the fact that the value-title pattern hides some amount of data which tends to be a machine-specific duplicate of data that is provided in the human readable content, there are two microformats principles being compromised: visibility and DRY. Thus the applicability of this pattern is deliberately restricted to properties that have demonstrated through experience a need for it, with no known better alternative.

In general authors should:

  1. First, try to directly specify microformats property values inline (the most visible, no duplication),
  2. Then consider using the value-class pattern
    1. Including multiple value elements for date and time properties
  3. and then only if those methods are insufficient, consider the value-title pattern.

This document post-dates other microformat specifications, such that they may not yet indicate which properties permit use of this pattern. In the interim, only the following types of properties should allow the value-title pattern.

The machine-data page has documentation of some of the properties of some specs which experience has shown need a solution like the value-title pattern.

There are some simple reference examples and tests for this pattern on value-class-pattern-tests.

In future use, specification authors may inherit use of value-title by use of ISO8601 date and time formats, or reuse of other microformats, but specifications should _avoid_ introducing new data structures that depend on or encourage this pattern. New specifications are themselves expected to adhere to the principals of visible data and DRY.

H2VX workaround

H2VX does not yet support the 'value-title' feature of the value class pattern (still waiting for proper value-title tests on separate live pages). Thus if your page depends on H2VX, you should use the following techniques instead (from pbworks documentation)

E.g. if the value to be placed in the value-title is both human and machine readable, instead of:

<span class="p-rsvp"><span class="value-title" title="yes">going</span></span>

Use an abbr (ok only if the value is human readable/listenable)

<abbr class="p-rsvp" title="yes">going</abbr>

Otherwise if the value is only machine readable, or human-unfriendly, instead of the empty span technique:

<span class="p-rsvp"><span class="value-title" title="yes"> </span> going</span>

Use an empty abbr:

<abbr class="p-rsvp" title="yes"></abbr> going

Test cases

See value-class-pattern-tests.

FAQ

This section is informative.

Frequently asked questions about the value-class-pattern. Once this section grows too big, we'll make a separate wiki page (like value-class-faq).

  • Is the value-class pattern supported by any of the microformats tools?
  • Why use an 'empty' element? Why not embed data in the class attribute?
    • A: 'class' is for field names, not data. The class attribute is inappropriate for embedded data values, as per the HTML4 specification, which states class is for ‘general purposing processing’, which is defined as ‘e.g. for identifying fields when extracting data from HTML pages into a database, translating HTML documents into other formats, etc.’. ‘General purpose processing’ does not extend to data itself. Furthermore, this method avoids inventing a new string pattern for embedding data.
  • Why use an 'empty' element? Why not make up a new attribute, like ‘data’?
    • A: New attributes are invalid. Microformats exist and function in valid HTML. Those are the current standards for web development, and microformats exist for use now. In the future, perhaps revisions of HTML will offer up another solution. For now, this method has been tested against browsers, and creates a consistent document structure (where machine-form and human-form data are siblings).
  • Shouldn't the title attribute only be used for content?
    • A: 'title' is used for content, machine readable content. The title attribute is used for content and is read by microformats parsers. This exists for cases where data cannot be parsed with sufficient precision from just the commonly published, visible information. This pattern allows both forms of content to be included, whilst keeping it invisible to human consumers.
  • How should microformats2 parsers handle improperly nested value-class-patterns inside p- properties? *:Consider the following markup.
<div class="h-card">
  <div class="p-tel">
    <span class="value">0123456789</span>
    <div class="h-card">
      <div cass="p-tel">
        <span class="value">9876543210<span>
      </div>
    </div>
  </div>
</div>
  • Why might someone write some markup like this? Ask a consulting psychologist. WordPress template authors, the sort of people enamoured with trendy CSS frameworks and so on—there's plenty of scope for crappy markup. The value-class-pattern spec as currently written (specficially §4 of Basic parsing) instructs implementers to not handle nested elements with class value, but in the context of a microformats2 parser, it would seem reasonable for an implementer to assume that the author here did not intend to make the text content of the second microformats2 object instance part of the value of the first. The question then is what to do with this kind of markup (other than find the author and ask him or her to kindly rewrite it). —Tom Morris 20:02, 7 November 2013 (UTC)

You can also refer to the general Microformats FAQ and principles.

Examples in the wild

This section is informative.

The following sites and pages have started marking up content with the value-class-pattern, and are thus good places to go for examples with real world content to test with implementations (i.e. parsers). If you use the value-class-pattern in your content, feel free to add it to the top of this list. Once the list grows too big, we'll make a separate wiki page (like value-class-examples-in-wild).

Add your site/page(s) that use the value-class-pattern here, along with a brief description of what value-class-pattern features you use, with which microformat(s) and which of its/their properties.

Implementations

This section is informative.

The following implementations have been developed which either generate or parse value-class-pattern property values. If you have an value-class-pattern implementation, feel free to add it to the top of this list. Once the list grows too big, we'll make a separate wiki page (like value-class-implementations).

consuming and parsing tools

publishing tools

Background

The value class pattern is derived from value-excerpting in hCard.

Sometimes, only a part of an element's content is to be used as the value of a microformat property. This may occur when a property has optional subproperties, such as tel: type and tel: value in hCard. Other times, the most appropriate structure for a property may include other content.

Articles

This section is informative.

Articles and blog posts discussing the value class pattern, most recent first. When this section gets too big, create a separate page like: value-class-pattern-articles

References

This section is informative.

Related Pages

This section is informative.

Translations

Read the value-class-pattern specification in additional languages:

Categories

Value Class Pattern was last modified: Wednesday, November 13th, 2013

Views