r3037 - maintenance->trunk sync of changesets 2025~2026
[racktables] / inc / functions.php
index 80cfe91c6c4f1ffd798112efe89c899c4028587f..ce2ce5fb0ebc94878bb2fa6b174ea351db78a8f3 100644 (file)
@@ -203,9 +203,9 @@ function setDisplayedName (&$cell)
        {
                $cell['atags'][] = array ('tag' => '$nameless');
                if (considerConfiguredConstraint ($cell, 'NAMEWARN_LISTSRC'))
-                       $cell['dname'] = 'ANONYMOUS ' . $cell['objtype_name'];
+                       $cell['dname'] = 'ANONYMOUS ' . decodeObjectType ($cell['objtype_id'], 'o');
                else
-                       $cell['dname'] = '[' . $cell['objtype_name'] . ']';
+                       $cell['dname'] = '[' . decodeObjectType ($cell['objtype_id'], 'o') . ']';
        }
 }
 
@@ -705,9 +705,8 @@ function buildPortCompatMatrixFromList ($portTypeList, $portCompatList)
 // object is returned (which may appear 0 and more elements long).
 function findAllEndpoints ($object_id, $fallback = '')
 {
-       $values = getAttrValues ($object_id);
-       foreach ($values as $record)
-               if ($record['name'] == 'FQDN' && strlen ($record['value']))
+       foreach (getAttrValues ($object_id) as $record)
+               if ($record['id'] == 3 && strlen ($record['value'])) // FQDN
                        return array ($record['value']);
        $regular = array();
        foreach (getObjectIPv4Allocations ($object_id) as $dottedquad => $alloc)
@@ -725,11 +724,13 @@ function findAllEndpoints ($object_id, $fallback = '')
 // 3. [[word word word | URL]]
 // This function parses the line and returns text suitable for either A
 // (rendering <A HREF>) or O (for <OPTION>).
-function parseWikiLink ($line, $which, $strip_optgroup = FALSE)
+function parseWikiLink ($line, $which)
 {
        if (preg_match ('/^\[\[.+\]\]$/', $line) == 0)
        {
-               if ($strip_optgroup)
+               // always strip the marker for A-data, but let cookOptgroup()
+               // do this later (otherwise it can't sort groups out)
+               if ($which == 'a')
                        return ereg_replace ('^.+%GSKIP%', '', ereg_replace ('^(.+)%GPASS%', '\\1 ', $line));
                else
                        return $line;
@@ -737,13 +738,17 @@ function parseWikiLink ($line, $which, $strip_optgroup = FALSE)
        $line = preg_replace ('/^\[\[(.+)\]\]$/', '$1', $line);
        $s = explode ('|', $line);
        $o_value = trim ($s[0]);
-       if ($strip_optgroup)
-               $o_value = ereg_replace ('^.+%GSKIP%', '', ereg_replace ('^(.+)%GPASS%', '\\1 ', $o_value));
-       $a_value = trim ($s[1]);
-       if ($which == 'a')
-               return "<a href='${a_value}'>${o_value}</a>";
        if ($which == 'o')
                return $o_value;
+       $o_value = ereg_replace ('^.+%GSKIP%', '', ereg_replace ('^(.+)%GPASS%', '\\1 ', $o_value));
+       $a_value = trim ($s[1]);
+       return "<a href='${a_value}'>${o_value}</a>";
+}
+
+// FIXME: should this be saved as "P-data"?
+function execGMarker ($line)
+{
+       return ereg_replace ('^.+%GSKIP%', '', ereg_replace ('^(.+)%GPASS%', '\\1 ', $line));
 }
 
 // rackspace usage for a single rack
@@ -872,6 +877,26 @@ function pokeNode (&$tree, $trace, $key, $value, $threshold = 0)
        }
 }
 
+// Likewise traverse the tree with the trace and return the final node.
+function peekNode ($tree, $trace, $target_id)
+{
+       $self = __FUNCTION__;
+       if (NULL === ($next = array_shift ($trace))) // warm
+       {
+               foreach ($tree as $node)
+                       if ($node['id'] == $target_id) // hot
+                               return $node;
+       }
+       else // cold
+       {
+               foreach ($tree as $node)
+                       if ($node['id'] == $next) // warmer
+                               return $self ($node['kids'], $trace, $target_id);
+       }
+       // HCF
+       return NULL;
+}
+
 // Build a tree from the item list and return it. Input and output data is
 // indexed by item id (nested items in output are recursively stored in 'kids'
 // key, which is in turn indexed by id. Functions, which are ready to handle
@@ -980,7 +1005,7 @@ function getExplicitTagsOnly ($chain)
                        if ($tagidA == $tagidB)
                                continue;
                        if (!isset ($tagRelCache[$tagidA][$tagidB]))
-                               $tagRelCache[$tagidA][$tagidB] = tagOnChain ($chain[$keyA], $taglist[$tagidB]['trace']);
+                               $tagRelCache[$tagidA][$tagidB] = in_array ($tagidA, $taglist[$tagidB]['trace']);
                        if ($tagRelCache[$tagidA][$tagidB] === TRUE) // A is ancestor of B
                                continue 2; // skip this A
                }
@@ -2114,4 +2139,46 @@ function dump ($var)
        echo '</pre></div>';
 }
 
+function getTagChart ($limit = 0, $realm = 'total', $special_tags = array())
+{
+       global $taglist;
+       // first build top-N chart...
+       $toplist = array();
+       foreach ($taglist as $taginfo)
+               if (isset ($taginfo['refcnt'][$realm]))
+                       $toplist[$taginfo['id']] = $taginfo['refcnt'][$realm];
+       arsort ($toplist, SORT_NUMERIC);
+       $ret = array();
+       $done = 0;
+       foreach (array_keys ($toplist) as $tag_id)
+       {
+               $ret[$tag_id] = $taglist[$tag_id];
+               if (++$done == $limit)
+                       break;
+       }
+       // ...then make sure, that every item of the special list is shown
+       // (using the same sort order)
+       $extra = array();
+       foreach ($special_tags as $taginfo)
+               if (!array_key_exists ($taginfo['id'], $ret))
+                       $extra[$taginfo['id']] = $taglist[$taginfo['id']]['refcnt'][$realm];
+       arsort ($extra, SORT_NUMERIC);
+       foreach (array_keys ($extra) as $tag_id)
+               $ret[] = $taglist[$tag_id];
+       return $ret;
+}
+
+function decodeObjectType ($objtype_id, $style = 'r')
+{
+       static $types = array();
+       if (!count ($types))
+               $types = array
+               (
+                       'r' => readChapter (CHAP_OBJTYPE),
+                       'a' => readChapter (CHAP_OBJTYPE, 'a'),
+                       'o' => readChapter (CHAP_OBJTYPE, 'o')
+               );
+       return $types[$style][$objtype_id];
+}
+
 ?>