1 <?php rcs_id('$Id: Units.php,v 1.3 2007-05-01 16:18:35 rurban Exp $');
4 * Interface to man units(1), /usr/share/units.dat
7 * Definition: 9.6347558e+08 m^2
8 * $ units "372.0 mi2" m^2
9 * Definition: 9.6347558e+08 m^2
12 * CachedMarkup.php: Cached_SemanticLink::_expandurl()
13 * SemanticWeb.php: class SemanticAttributeSearchQuery
15 * Windows requires the cygwin /usr/bin/units.
16 * All successfully parsed unit definitions are stored in the wikidb,
17 * so that subsequent expansions will not require /usr/bin/units be called again.
18 * So far even on windows (cygwin) the process is fast enough.
20 * TODO: understand dates and maybe times
21 * YYYY-MM-DD, "CW"ww/yy (CalendarWeek)
25 function Units ($UNITSFILE = false) {
28 elseif (defined("UNITS_EXE")) // ignore dynamic check
31 exec("units m2", $o, $this->errcode);
35 * $this->_attribute_base = $units->Definition($this->_attribute);
37 function Definition ($query) {
38 static $Definitions = array();
39 if (isset($Definitions[$query])) return $Definitions[$query];
42 $query = preg_replace("/,/","", $query);
43 if ($query == '' or $query == '*')
44 return ($Definitions[$query] = '');
45 // detect date values, currently only ISO: YYYY-MM-DD or YY-MM-DD
46 if (preg_match("/^(\d{2,4})-(\d{1,2})-(\d{1,2})$/",$query, $m)) {
47 $date = mktime(0,0,0,$m[2],$m[3],$m[1]);
48 return ($Definitions[$query] = "$date date");
50 if (preg_match("/^(\d{2,4})-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{2}):?(\d{2})?$/",$query, $m)) {
51 $date = mktime($m[4],$m[5],@$m[6],$m[2],$m[3],$m[1]);
52 return ($Definitions[$query] = "$date date");
54 $def = $this->_cmd("\"$query\"");
55 if (preg_match("/Definition: (.+)$/",$def,$m))
56 return ($Definitions[$query] = $m[1]);
58 trigger_error("units: ". $def, E_USER_WARNING);
64 * We must ensure that the same baseunits are matched against.
65 * We cannot compare m^2 to m or ''
66 * $val_base = $this->_units->basevalue($value); // SemanticAttributeSearchQuery
68 function basevalue($query, $def = false) {
69 if (!$def) $def = $this->Definition($query);
71 if (is_numeric($def)) // e.g. "1 million"
73 if (preg_match("/^([-0-9].*) \w.*$/",$def,$m))
80 * $this->_unit = $units->baseunit($this->_attribute); // SemanticAttributeSearchQuery
81 * and Cached_SemanticLink::_expandurl()
83 function baseunit($query, $def = false) {
84 if (!$def) $def = $this->Definition($query);
86 if (preg_match("/ (.+)$/",$def,$m))
92 function _cmd($args) {
93 if ($this->errcode) return $args;
94 if (defined("UNITS_EXE")) {
95 $s = UNITS_EXE ." $args";
99 $result = `units $args`;
100 return trim($result);