Mercurial > hg > drupalISMI
diff ISMIBioFilter/ISMIBioFilter.module @ 0:124ef8f3b22d
initial
author | Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de> |
---|---|
date | Fri, 27 Mar 2015 19:21:42 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ISMIBioFilter/ISMIBioFilter.module Fri Mar 27 19:21:42 2015 +0100 @@ -0,0 +1,659 @@ +<?php + +/** + * @file + * Provides a Markdown input filter. + */ + + + + +function ISMIBioFilter_menu(){ + $items['showBio/%'] = array( + 'title' => 'View', + 'description' => 'show an object.', + 'page callback' => 'ISMIBioFilter_showBio_page', + 'access arguments' => array('access content'), + 'page arguments' => array(1), + + 'access arguments' => array('access content'), + 'type' => MENU_LOCAL_TASK, + + ); + + $items['showEntity/%'] = array( + 'title' => 'View', + 'description' => 'show an object.', + 'page callback' => 'ISMIBioFilter_showEntity_page', + 'access arguments' => array('access content'), + 'page arguments' => array(1), + + 'access arguments' => array('access content'), + 'type' => MENU_LOCAL_TASK, + + ); + + + return $items; + + +} + + +function ISMIBioFilter_showEntity_page($keys){ + #$results = db_query("SELECT * FROM {field_data_field_id} n where field_id_value ='" . $keys . "' and bundle = 'openmind_entity' "); + #$results = db_query("SELECT * FROM {field_data_field_id} n where field_id_value ='" . $keys . "' "); + + $query = new EntityFieldQuery; + $query->entityCondition('entity_type', 'node') + ->entityCondition('bundle', 'openmind_entity') + ->fieldCondition('field_id', 'value',$value = $keys); + $results = $query->execute(); + + if (isset($results['node'])){ + $nids = array_keys($results['node']); + + foreach ($nids as $nid){ + + drupal_goto("node/" . $nid); + } + } else { + drupal_goto("/unknownEntity"); + } + +} + +function ISMIBioFilter_showBio_page($keys){ + ##$results = db_query("SELECT * FROM {field_data_field_original_url} n where field_original_url_value ='" . $keys . "'"); + + # zerlege den string + $paths = explode("/",$keys); + #gebraucht wird nur der letzte teil + + $fn = $paths[sizeof(paths)-1]; + dpm($fn); + dpm($keys); + drupal_goto($fn); + #foreach ($results as $result){ + # drupal_goto("node/" . $result->entity_id); + #} +} +/** + * Implements hook_help(). + */ +function ISMIBioFilter_help($path, $arg) { + switch ($path) { + case 'admin/help#ISMIBioFilter': + return t('<p> Filters the original biographies to make the Drupal compatible.</p>'); + } +} + +/** + * Implements hook_filter_info(). + */ +function ISMIBioFilter_filter_info() { + $filters['filter_ISMIBioFilter'] = array( + 'title' => t('ISMIBioFilter'), + 'description' => t('Filter for the Biographies from the Springer Website'), + 'process callback' => '_filter_ISMIBioFilter', + 'settings callback' => '_filter_ISMIBioFilter_settings', + 'tips callback' => '_filter_ISMIBioFilter_tips', + ); + + return $filters; +} + + +function _ISMIBioFilter_getSources($rel){ + $vals = array(); + $relNode = relation_load($rel->rid); + $eps = relation_get_endpoints($relNode); + foreach($eps as $ep){ + + $vals[]=array_shift(array_values($ep)); + + } + + return $vals; +} + +function _ISMIBioFilter_getTargets($rel){ + $vals = array(); + $relNode = relation_load($rel->rid); + $eps = relation_get_endpoints($relNode); + foreach($eps as $ep){ + + $ar = array_values($ep); + array_shift($ar); + $vals[]=array_shift($ar); + } + + return $vals; +} + + +/** + * Returns the ISMIBioFilter input filter tips. + * @TODO: make it easier for translators. + */ +function _filter_ISMIBioFilter_tips($format, $long = FALSE) { + if ($long) { + return t('no tip'); + } + else { + return t('no tip'); + } +} + +/** + * Implements hook_block_view(). + */ +function ISMIBioFilter_block_view($delta = '') { + $block = array(); + switch ($delta) { + case 'ISMIBioFilter_help': + $block['title'] = t('ISMIBio filter tips'); + $block['content'] = _ISMIBioFilter_help_block(); + break; + + + case 'ISMIObjects_main': + // main info for an object + + $node = menu_get_object(); + + //node hat keine objektype dann mache nichts + if (!isset($node->field_oc)){ + break; + } + + $tid = $node->field_oc[LANGUAGE_NONE][0]['tid']; + $taxonomy = taxonomy_term_load($tid)->name; + + switch($taxonomy){ + + case 'PERSON': + $ov = $node->field_ov[LANGUAGE_NONE][0]['value']; + $nov = $node->field_nov[LANGUAGE_NONE][0]['value']; + $block['title'] = t('Person'); + //$block['content']= theme('ISMIPersons_main',array('node' => $node)); + + $rows[] = array("Name",$ov); + $rows[] = array("Normalisiert",$nov); + + $block['content']=theme('table', array('header' => null, 'rows' => $rows)); + + + //is_prime_alias_name_of,invOf_is_prime_alias_name_of, invOf_is_alias_name_of ,is_alias_name_of + $rels = relation_query("node",$node->nid)->execute(); + $prime_alias = ""; + $aliases = array(); + + foreach($rels as $rel){ + + switch($rel->relation_type){ + case "is_prime_alias_name_of": + $prime_alias = _ISMIBioFilter_getSources($rel); + break; + + case "is_alias_name_of": + $aliases = _ISMIBioFilter_getSources($rel); + break; + } + } + + $block['content'] .= theme("ISMIObject_aliases",array("prime_alias"=>$prime_alias,"aliases"=>$aliases)); + break; + + case 'TEXT': + $ov = $node->field_ov[LANGUAGE_NONE][0]['value']; + $nov = $node->field_nov[LANGUAGE_NONE][0]['value']; + $block['title'] = t('Text'); + //$block['content']= theme('ISMIPersons_main',array('node' => $node)); + + $rows[] = array("Title",$ov); + $rows[] = array("Normalisiert",$nov); + + $block['content']=theme('table', array('header' => null, 'rows' => $rows)); + $rels = relation_query("node",$node->nid)->execute(); + $prime_alias = ""; + $aliases = array(); + + foreach($rels as $rel){ + + switch($rel->relation_type){ + case "is_prime_alias_name_of": + $prime_alias = _ISMIBioFilter_getSources($rel); + break; + + case "is_alias_name_of": + $aliases = array_merge($aliases,_ISMIBioFilter_getSources($rel)); + break; + } + } + + $block['content'] .= theme("ISMIObject_aliases",array("prime_alias"=>$prime_alias,"aliases"=>$aliases)); + + } + + break; + + case 'ISMIObjects_titles': + + $node = menu_get_object(); + //node hat keine objektype dann mache nichts + if (!isset($node->field_oc)){ + break; + } + + + $tid = $node->field_oc[LANGUAGE_NONE][0]['tid']; + $taxonomy = taxonomy_term_load($tid)->name; + + switch($taxonomy){ + + case 'PERSON': + $rels = relation_query("node",$node->nid)->execute(); + + foreach($rels as $rel){ + + if ($rel->relation_type=="was_created_by"){ + $relNode = relation_load($rel->rid); + $targets = relation_get_endpoints($relNode); + foreach($targets as $target){ + + $titles[]=array_shift(array_values($target)); + + + + + } + } + } + + $block['title'] = t('Titles'); + $block['content']= theme('ISMIPersons_titles',array('titles' => $titles)); + + } + break; + + case 'ISMIText_witnesses': + $node = menu_get_object(); + //node hat keine objektype dann mache nichts + if (!isset($node->field_oc)){ + break; + } + + + $tid = $node->field_oc[LANGUAGE_NONE][0]['tid']; + $taxonomy = taxonomy_term_load($tid)->name; + + switch($taxonomy){ + + case 'TEXT': + $rels = relation_query("node",$node->nid)->execute(); + $titles=array(); + foreach($rels as $rel){ + + if ($rel->relation_type=="is_exemplar_of"){ + $titles = array_merge($titles,_ISMIBioFilter_getSources($rel)); + + } + } + + _ISMIBioFilter_enrich($titles); + + $block['title'] = t('Witnesses'); + //$block['content']= theme('ISMIWitnesses_list',array('witnesses' => $titles)); + + // create table + $rows=array(); + + foreach ($titles as $witness){ + + $rows[]=array( + l($witness->field_nov[LANGUAGE_NONE][0]['value'],$witness->nid), + l($witness->codex->field_nov[LANGUAGE_NONE][0]['value'],$witness->codex->nid), + l($witness->collection->field_nov[LANGUAGE_NONE][0]['value'],$witness->collection->nid), + l($witness->repository->field_nov[LANGUAGE_NONE][0]['value'],$witness->repository->nid), + l($witness->place->field_nov[LANGUAGE_NONE][0]['value'],$witness->place->nid) + ); + } + + $header = array("witness","codex","collection","repository","place"); + $block['content'] = array( + '#theme' => 'table', + '#header' => $header, + '#rows' => $rows, + ); + #$block['content'] = theme("table",array('header'=>null,'rows'=>$rows)); + } + break; + + + case 'ISMIPersons_bea': + $node = menu_get_object(); + //node hat keine objektype dann mache nichts + if (!isset($node->field_oc)){ + break; + } + + $tid = $node->field_oc[LANGUAGE_NONE][0]['tid']; + $taxonomy = taxonomy_term_load($tid)->name; + switch($taxonomy){ + + case 'PERSON': + + + + $author_id = $node->field_id[LANGUAGE_NONE][0]['value']; + + + $query = new EntityFieldQuery; + $query->entityCondition('entity_type', 'node') + ->entityCondition('bundle', 'biography') + ->fieldCondition('field_id', 'value',$value = $author_id); + $results = $query->execute(); + + if (isset($results['node'])){ + $nids = array_keys($results['node']); + + foreach ($nids as $nid){ + + $body = entity_load_single("node", $nid)->body[LANGUAGE_NONE][0]['value']; + + $block['title'] = t('BEA'); + $block['content']= $body; + } + } + } + break; + + + case 'ISMIObjects_relations': + $node = menu_get_object(); + $author_id = $node->field_id[LANGUAGE_NONE][0]['value']; + + + $rels = relation_query("node",$node->nid)->execute(); + + $block['content'] = ISMIBioFilter_RelationsFormat("node",$node,$rels); + + break; + } + + return $block; +} + +/** + * Implements hook_block_info(). + */ +function ISMIBioFilter_block_info() { + $blocks = array(); + $blocks['ISMIBioFilter_help'] = array( + 'info' => t('ISMI Bio filter tips'), + ); + $blocks['ISMIObjects_main'] = array( + 'info' => t('ISMI Main information of an object'), + ); + + $blocks['ISMIObjects_titles'] = array( + 'info' => t('ISMI Titles related to an object'), + ); + + $blocks['ISMIPersons_bea'] = array( + 'info' => t('ISMI Bea Entry of Person'), + ); + + $blocks['ISMIObjects_relations'] = array( + 'info' => t('ISMI all relations'), + ); + + $blocks['ISMIText_witnesses'] = array( + 'info' => t('ISMI witnesses'), + ); + + return $blocks; +} + +/** + * Provides content for the ISMIBioFilter help block. + */ +function _ISMIBioFilter_help_block() { + return '<pre>' . t('Replaces external links to authors in the text to links to nodes in this website. ') . '</pre>'; +} + +/** + * + * Filter process callback. + */ +function _filter_ISMIBioFilter($text, $format) { + if (!empty($text)) { + + $params = drupal_get_query_parameters(); + + $text=preg_replace('/href="([^>]+?_BEA.htm)"\>/', 'href="$1">', $text); + + $text=preg_replace('#</span>\n#',"</span>",$text); #remove returns nach span otherwise this gives an extra space + + $text=preg_replace('#style="[^"]+#',"",$text); #remove all style information + + + } + + return $text; +} + +/** + * Filter settings callback. Just provides a version overview. + */ +function _filter_ISMIBioFilter_settings($form, &$form_state, $filter, $format, $defaults) { + module_load_include('php', 'ISMIBioFilter', 'ISMIBioFilter'); + + $settings['ISMIBioFilter_wrapper'] = array( + '#type' => 'fieldset', + '#title' => t('ISMIBioFilter'), + ); + $links = array('NO LINK', + /*'Markdown PHP Version: <a href="http://michelf.com/projects/php-ISMIBioFilter/">' . MARKDOWN_VERSION . '</a>', + 'Markdown Extra Version: <a href="http://michelf.com/projects/php-ISMIBioFilter/">' . MARKDOWNEXTRA_VERSION . '</a>',*/ + ); + $settings['ISMIBioFilter_wrapper']['ISMIBioFilter_status'] = array( + '#title' => t('Versions'), + '#type' => 'item', + '#markup' => theme('item_list', array('items' => $links)), + ); + + return $settings; +} + + +/* add id to url */ + +function ISMIBioFilter_addIDs(){ + $txt = file_get_contents(drupal_get_path("module", "ISMIBioFilter") . "/bio2ismi.txt"); + $lines = explode("\n",$txt); + foreach ($lines as $line){ + $content = explode(" ",$line); + $id = $content[0]; + $origPath=$content[sizeof($content)-1]; + $path = explode("/",$origPath); + $url = $path[sizeof($path)-1]; + + + $nodePath = explode("/",drupal_lookup_path("source",$url)); + #$nodePath = explode("/",drupal_lookup_path("source",str_replace(".htm","",$url))); + + $nodeId = $nodePath[sizeof($nodePath)-1]; + + if ($nodeId != ""){ + $node = node_load($nodeId); + + $node->field_id[LANGUAGE_NONE][0]['value']=$id; + dpm($node); + + node_save($node); + } + } + + +} + + +function ISMIBioFilter_field_formatter_info(){ + return array( + // This formatter shows the obejct with fullmetadata + 'ISMIBioFilter_entityLink' => array( + 'label' => t('Entity Link Formatter'), + 'field types' => array('text'), + ), + ); +} + +function ISMIBioFilter_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { + $element = array(); + + #TODO make this configurable + $text ="Show data entry"; + + switch ($instance['label']){ + case 'author_id': + $text = "More about the author"; + } + + switch ($display['type']) { + // This formatter simply outputs the field as text and with a color. + case 'ISMIBioFilter_entityLink': + foreach ($items as $delta => $item) { + if ($item['value']!=""){ + + $element[$delta]['#markup'] = l($text,"showEntity/" . $item['value']); + + } + } + break; + + } + return $element; +} + + + +function ISMIBioFilter_theme(){ + + return array( + 'ISMIObject_aliases' => array( + 'variables' => array($prime_alias=null,$aliases=null), + 'template' => 'ISMIObject-aliases', + ), + + 'ISMIPersons_titles' => array( + 'variables' => array('titles' => NULL), + 'template' => 'ISMITitlesOfPerson', + ), + + 'ISMIWitnesses_list' => array( + 'variables' => array('witnesses' => NULL), + 'template' => 'ISMIWitnesses-list', + ), + ); +} + +function ISMIBioFilter_RelationsFormat($entity_type,$entity,$rels){ + $ret =""; + $sentences = array(); + + + foreach ($rels as $item) { + list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity); + $relation = (object) relation_load($item->rid); + + $relation_type = relation_type_load($relation->relation_type); + + $subject = entity_label($entity_type, $entity) . ' '; // Subject of the sentence. + $subject_is_source = ($relation->endpoints[LANGUAGE_NONE]['0']['entity_id']) == $id ? TRUE : FALSE; + $count = 0; // For comma separation of objects. + $duplicate = FALSE; // To make sure duplicates of $entity get included in object list. + $objects = ''; // Comma separated list of entities that are the object of the sentence. + // Gramatical predicate of teh sentence. + $predicate = $relation_type->directional ? $relation_type->reverse_label : $relation_type->label; + + foreach ($relation->endpoints[LANGUAGE_NONE] as $endpoint) { + // Add all entities that aren't this entity to the sentence $objects. + // Check for duplicates of the $subject first. + if ($endpoint['entity_type'] == $entity_type && $endpoint['entity_id'] == $id && $duplicate == FALSE) { + $duplicate = TRUE; + // Use the forward label as sentence predicate if r_index == 0. + // (only makes a difference if relation is directional). + if ($endpoint['r_index'] == 0) { + $predicate = ' ' . $relation_type->label; + } + } + else { + // If the relation is directional and the subject isn't the source, + // we want to list the source without any siblings. If it is + // directional and the subject is a source, list all targets. + // If non-directional, list everything as normal. + if (!$relation_type->directional || $subject_is_source || $endpoint['r_index'] == 0) { + $object_entities = entity_load($endpoint['entity_type'], array($endpoint['entity_id'])); + $object_entity = reset($object_entities); + $object_label = entity_label($endpoint['entity_type'], $object_entity); + $object_uri = entity_uri($endpoint['entity_type'], $object_entity); + // Just add a space before the first element, comma and space before further ones. + $objects .= $count ? ', ' : ' '; + $count += 1; + $objects .= l($object_label, $object_uri['path']); + + $ret .=theme('item_list',array('items' => array(".." . $predicate . $objects))); + } + } + + + } + + + + + } + + return $ret; +} + +function _ISMIBioFilter_non_indentical($tars,$nid){ + $ret=array(); + foreach($tars as $tar){ + if($tar->nid!=$nid){ + $ret[]=$tar; + } + } + return $ret; +} +function _ISMIBioFilter_enrich(&$titles){ + foreach($titles as $title){ + $title->codex=_ISMIBioFilter_find_unique_entity("is_part_of",$title->nid); + $title->collection=_ISMIBioFilter_find_unique_entity("is_part_of",$title->codex->nid); + $title->repository=_ISMIBioFilter_find_unique_entity("is_part_of",$title->collection->nid); + $title->place=_ISMIBioFilter_find_unique_entity("is_in",$title->repository->nid); + + } +} + + + + + +function _ISMIBioFilter_find_unique_entity($rel_type,$nid){ + $rels = relation_query("node",$nid)->execute(); + $is_in_place=array(); + foreach($rels as $rel){ + if ($rel->relation_type==$rel_type){ + $reps = _ISMIBioFilter_getTargets($rel); + $is_in_place = array_merge($is_in_place,_ISMIBioFilter_non_indentical($reps,$nid)); + } + + } + return $is_in_place[0]; +} + + +