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];
+}
+
+
+