'); drupal_set_breadcrumb($breadcrumb); $vocabs = tripal_get_vocabularies(); $rows = []; foreach ($vocabs as $vocabulary) { $rows[] = [ l($vocabulary['short_name'], 'cv/lookup/' . $vocabulary['short_name']), $vocabulary['name'], $vocabulary['description'], [ 'data' => number_format($vocabulary['num_terms']), 'style' => 'text-align: right;', ], ]; } $headers = [ 'Short Name', 'Vocabulary Name(s)', 'Description', 'Loaded Terms', ]; $table = [ 'header' => $headers, 'rows' => $rows, 'attributes' => [], 'sticky' => FALSE, 'caption' => '', 'colgroups' => [], 'empty' => t('There are no controlled vocabularies'), ]; $content = [ 'description' => [ '#type' => 'markup', '#markup' => '

The following controlled vocabularies are used on this site. Click a vocabulary short name for more details.

', ], 'vocab_table' => [ '#type' => 'item', '#markup' => theme_table($table), ], ]; return $content; } /** * Provides the content for a single controlled vocabulary. */ function tripal_vocabulary_lookup_vocab_page($vocabulary) { // set the breadcrumb $breadcrumb = []; $breadcrumb[] = l('Home', ''); $breadcrumb[] = l('Controlled Vocabularies', 'cv/lookup'); drupal_set_breadcrumb($breadcrumb); $vocab = tripal_get_vocabulary_details($vocabulary); $vocab_table = tripal_vocabulary_get_vocab_details($vocab); if ($vocab['description']) { drupal_set_title($vocabulary . ': ' . $vocab['description']); } else { drupal_set_title($vocabulary); } // If we can't find the term then just return a message. if (!$vocab) { drupal_set_message('The vocabulary cannot be found on this site', 'error'); return ''; } $has_root = TRUE; $root_terms = tripal_get_vocabulary_root_terms($vocabulary); // If this vocabulary doesn't have root terms then it's either not an // ontology or not all of the terms are loaded. In this case, let's get // a paged list of all terms if (count($root_terms) == 0) { $root_terms = tripal_get_vocabulary_terms($vocabulary, 25); $has_root = FALSE; } $items = tripal_vocabulary_lookup_term_children_format($root_terms); if (count($root_terms) == 0) { $items = '

This vocabulary has no terms loaded

'; } else { $items = '

Click the + icon (if present) to expand the tree. If ' . 'the full ontology or the term heirarchy is not loaded into this site, ' . 'then the tree will consist of all terms at the same level. ' . 'For some vocabularies, only a subset of terms are loaded

' . $items; } drupal_add_js([ 'tripal' => [ 'cv_lookup' => [ 'vocabulary' => $vocabulary, ], ], ], 'setting'); $content = [ 'vocab_table' => [ '#type' => 'item', '#title' => 'Details', '#markup' => '

A vocabulary is always identified by its short name ' . 'and sometimes it may offer multiple sub-vocabularies with different ' . 'names. Both are listed below.

' . $vocab_table, ], 'vocab_browser' => [ '#type' => 'item', '#title' => 'Term Browser', '#markup' => $items, ], ]; if (!$has_root) { $content['pager'] = [ '#type' => 'markup', '#markup' => theme('pager'), ]; } // Add support for our custom tree viewer drupal_add_css(drupal_get_path('module', 'tripal') . '/theme/css/tripal.cv_lookup.css'); drupal_add_js(drupal_get_path('module', 'tripal') . '/theme/js/tripal.cv_lookup.js', 'file'); return $content; } /** * Generates a table view of the vocabulary. * * @param $vocab * The vocabulary array. * * @return * An HTML rendered table describing the vocabulary. */ function tripal_vocabulary_get_vocab_details($vocab) { $headers = []; $rows = []; $vocab_name = $vocab['name']; $short_name = $vocab['short_name']; if ($vocab['url']) { $short_name = l($vocab['short_name'], $vocab['url'], ['attributes' => ['target' => '_blank']]); } $vocab_desc = $vocab['description']; $rows[] = [ [ 'data' => 'Short Name', 'header' => TRUE, 'width' => '20%', ], $short_name, ]; $rows[] = [ [ 'data' => 'Vocabulary Name(s)', 'header' => TRUE, 'width' => '20%', ], $vocab_name, ]; $rows[] = [ [ 'data' => 'Description', 'header' => TRUE, 'width' => '20%', ], $vocab_desc, ]; $rows[] = [ [ 'data' => 'Number of Terms Loaded on This Site', 'header' => TRUE, 'width' => '20%', ], number_format($vocab['num_terms']), ]; $table = [ 'header' => $headers, 'rows' => $rows, 'attributes' => [], 'sticky' => FALSE, 'caption' => '', 'colgroups' => [], 'empty' => '', ]; return theme_table($table); } /** * A helper function to format an array of terms into a list for the web page. * * @param $children * A list of children terms. */ function tripal_vocabulary_lookup_term_children_format($children) { $items = ''; if (count($children) == 0) { $items = ''; } return $items; } /** * An ajax callback to get the children of a term. * * @param $vocabulary * The short name of the vocabulary (e.g. SO, GO, etc.) * @param $accession * The term accession. * * @return * A JSON array compatible with the JSTree library. * https://www.jstree.com/docs/json/ */ function tripal_vocabulary_lookup_term_children_ajax($vocabulary, $accession) { $term = tripal_get_term_details($vocabulary, $accession); $children = tripal_get_term_children($vocabulary, $accession); $response = [ 'vocabulary' => $vocabulary, 'accession' => $accession, 'content' => tripal_vocabulary_lookup_term_children_format($children), ]; drupal_json_output($response); } /** * * @param $vocabulary * @param $accession * * @return */ function tripal_vocabulary_lookup_term_page($vocabulary, $accession) { // set the breadcrumb $breadcrumb = []; $breadcrumb[] = l('Home', ''); $breadcrumb[] = l('Controlled Vocabularies', 'cv/lookup'); $breadcrumb[] = l($vocabulary, 'cv/lookup/' . $vocabulary); drupal_set_breadcrumb($breadcrumb); $vocab = tripal_get_vocabulary_details($vocabulary); $vocab_table = tripal_vocabulary_get_vocab_details($vocab); $term = tripal_get_term_details($vocabulary, $accession); // If we can't find the term then just return a message. if (!$term) { drupal_set_message('The term cannot be found on this site', 'error'); return ''; } // Build the Term table. $headers = []; $rows = []; $term_name = $term['name']; $accession = $term['vocabulary']['short_name'] . ':' . $term['accession']; drupal_set_title($accession); // Create a URL to point this term to it's source page, but only if the // source is not this site. if ($term['url'] and !preg_match('/cv\/lookup/', $term['url'])) { $accession = l($accession, $term['url'], ['attributes' => ['target' => '_blank']]); } $rows[] = [ [ 'data' => 'Term', 'header' => TRUE, 'width' => '20%', ], $accession, ]; $rows[] = [ [ 'data' => 'Name', 'header' => TRUE, 'width' => '20%', ], $term_name, ]; $rows[] = [ [ 'data' => 'Definition', 'header' => TRUE, 'width' => '20%', ], $term['definition'], ]; // Now iterate through any other columns in the term array and add those // details. foreach ($term as $key => $value) { if (in_array($key, [ 'name', 'definition', 'vocabulary', 'accession', 'url', ])) { continue; } // Convert thisto an array so we can alter it. if (!is_array($value)) { $new_values[] = $value; $value = $new_values; } // If this is a relationship key then let's try to rewrite the GO // term in the relationship as a link. if ($key == 'relationship') { foreach ($value as $index => $v) { $matches = []; if (preg_match('/^(.+)\s(.+?):(.+?)$/', $v, $matches)) { $rel = $matches[1]; $voc = $matches[2]; $acc = $matches[3]; $v = $rel . ' ' . l($voc . ':' . $acc, 'cv/lookup/' . $voc . '/' . $acc, ['attributes' => ['target' => '_blank']]); $t = tripal_get_term_details($voc, $acc); if ($t) { $v .= ' (' . $t['name'] . ')'; } $value[$index] = $v; } } } if (count($value) > 1) { $value_str = theme_item_list([ 'items' => $value, 'type' => 'ul', 'attributes' => [], 'title' => '', ]); } else { $value_str = $value[0]; } $rows[] = [ [ 'data' => ucfirst($key), 'header' => TRUE, 'width' => '20%', ], $value_str, ]; } $table = [ 'header' => $headers, 'rows' => $rows, 'attributes' => [], 'sticky' => FALSE, 'caption' => '', 'colgroups' => [], 'empty' => '', ]; $content['cvterm'] = [ '#type' => 'item', '#title' => 'Term Details', '#markup' => theme_table($table), ]; $content['vocabulary'] = [ '#type' => 'item', '#title' => 'Vocabulary Details', '#markup' => $vocab_table, ]; drupal_add_js([ 'tripal' => [ 'cv_lookup' => [ 'vocabulary' => $vocabulary, 'accession' => $accession, ], ], ], 'setting'); return $content; }