Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Last revisionBoth sides next revision
buechereielektrik:unapi:unapi.inc.php [2010-01-10 22:21] – created rosenkebuechereielektrik:unapi:unapi.inc.php [2010-03-03 17:13] strols
Line 2: Line 2:
 <?php <?php
  
-/*  Copyright 2008 2009 Goetz Hatop +/
- *  Goetz Hatop's original Version can be found at + *  Purpose 
- *  <ftp://ftp.ub.uni-marburg.de/pub/research/unapi.tar.gz> + * 
 + *  These objects and their respective functions follow 
 + PicaRecord 
 +  - Picappn 
 + * 
 +  These functions follow 
 +  - final_result 
 + * 
 +  PHP5 and its curl module are recommended.
  */  */
  
-/*  Copyright 2009 Stephan Rosenke <rosenke@ulb.tu-darmstadt.de> */+/
 +  Copyright 
 + * 
 +  Copyright 2008 2009 Goetz Hatop <hatop@ub.uni-marburg.de>
 +  Goetz Hatop's original version can be found at 
 +  <ftp://ftp.ub.uni-marburg.de/pub/research/unapi.tar.gz>
 + * 
 + *  Copyright 2009 2010 Stephan Rosenke <rosenke@ulb.tu-darmstadt.de> or 
 +  <r01-551@r0s.de>. See also <http://r0s.de/unapi>
 + */
  
-/*  This program is free software: you can redistribute it and/or modify+/
 +  License 
 + * 
 + *  This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or   the Free Software Foundation, either version 3 of the License, or
Line 23: Line 43:
  */  */
  
-/*  Version: 0.*/+/
 + *  Version 
 + * 
 + *  0.
 + */
  
-/*  Changelog+/
 + *  Changelog
  *  *
 +  20100303: Added check of $use_curl as additional switch for de-
 + * activating curl.
 +  20100219: Added function "getCsv()" to class "Picappn".
 + * Renamend keys "RVK" to "rvk" and "DDC" to "ddc".
 +  20100131: Added (e)Journals to "getBibTex()", "getOpenUrlKev()" and
 + * "getText()" in class "Picappn".
 +  20100127: Added link in copyright.
 +  20100126: Transfered "getArrayNice()" from class "Picappn" to
 + * "PicaRecord". Removed dead code. Added comments.
 +  20100125: Added comments.
 + * Renamed "decodePica_array()" to "decodePicaArray()" in class
 + * "PicaRecord".
 +  20100113: Added comments. Added further mappings in "getArrayNice()".
 +  20100112: Added further mappings in "getArrayNice()".
 + * Extended types for monographies.
 +  20100111: Added function "getOpenUrlKev()" to class "Picappn".
 + * Removed functions "getKeysText()" and "getKeysBibTex()" from
 + * class "Picappn".
 +  20100110: Added input sanitising for $ppn.
 +  20100109: Some style improvements, added comments.
   20091220: Check whether curl-Module is available, if not use   20091220: Check whether curl-Module is available, if not use
-              file_get_contents(). + * "file_get_contents()"
-              Some minor bugfixes. + * Some minor bugfixes. 
-  20091215:   Added function "getJson" to class "Picappn"+  20091215: Added function "getJson()" to class "Picappn"
-              Made ISBN in getBibTex() unique. + * Made ISBN in "getBibTex()unique. 
-              Filtered some characters in getArrayNice(). + * Filtered some characters in "getArrayNice()"
-  20091214:   Added function "convOutputNice", "getArrayNice", "getBibsonomy", +  20091214: Added function "convOutputNice()", "getArrayNice()", 
-              "getKeysText" and "getKeysBibTex" to class "Picappn"+              "getBibsonomy()", getKeysText()" and "getKeysBibTex()" to class 
-              Handled empty records for dc and rdf. +              "Picappn"
-  20091213: Added function "convOutput" to class "Picappn"+ * Handled empty records for dc and rdf. 
-              Defined text-format. +  20091213: Added function "convOutput()" to class "Picappn"
-              Defined bibtex-format. + * Defined text-format. 
-  20091211:   Added function "final_result".+ * Defined bibtex-format. 
 +  20091211: Added function "final_result()".
   20091210: Put class "Picappn" to PicaRecord.php.   20091210: Put class "Picappn" to PicaRecord.php.
  * Ordered functions alphabetically.  * Ordered functions alphabetically.
- * Added functions "getArray", "getPlain" and  "getText" to class + * Added functions "getArray()", "getPlain()" and  "getText()" to 
- * "Picappn"+              class "Picappn"
- * Added functions "decodePicaArray", "getArray" and "getPlain" to + * Added functions "decodePicaArray()", "getArray()" and 
- * class "PicaRecord"+ * "getPlain()" to class "PicaRecord"
-  20091210: Started with Goetz Hatop's version of 2009-12-08+  20091210: Started with Goetz Hatop's version of 2009-12-08.
  */  */
  
-$opac_url = "http://pica1l.lhb.tu-darmstadt.de/DB=LHBDA/XML=1.0/PPN?PPN="; +/* 
-//$opac_url = "http://opac.ub.uni-marburg.de/XML=1.0/PPN?PPN="; +  Readme 
-//$opac_url = "http://cbsopac.rz.uni-frankfurt.de/XML=1.0/PPN?PPN="+ * 
-//$opac_url "http://gso.gbv.de/XML=1.0/PPN?PPN=";+  If you are using PHP4 then search for "comment out if using PHP4" and 
 +  comment it out, unClient.php won't work then. 
 + */ 
 + 
 +/
 +  set some user-defineable variables 
 + */ 
 + 
 +//  URL-prefix for XML interface 
 +$opac_url = 'http://example.com/DB=1/XML=1.0/PPN?PPN='; 
 + 
 +//  URL-prefix for Bibsonomy's BibTeX import 
 +$bibsonomy_url 'http://www.bibsonomy.org/BibtexHandler?requTask=upload&selection=';
  
-$bibsonomy_url "http://www.bibsonomy.org/BibtexHandler?requTask=upload&selection=";+//  Regex for checking if input is PPN 
 +$pattern_ppn '/^[0-9]{8}[0-9Xx]$/';
  
 +//  Array for filtering extracted bibliographic data
 $filter_nice = array( $filter_nice = array(
  '{' => '',  '{' => '',
-  '}' => ''+ '}' => ''
  );  );
  
-/** represents a bibliographic data record from oclc/pica LBS  +//  Hostname for generating rfr_id for OpenURL 
-  */+$rfr_id_hostname= 'example.com'; 
 + 
 +/* 
 + ******************************************************************************* 
 +  DO NOT MESS BEHIND THIS LINE                                               * 
 + ******************************************************************************* 
 + */ 
 + 
 +/* 
 +  class PicaRecord 
 + *  represents a bibliographic data record from OCLC/PICA LBS, puts record to a 
 +  XML structure or an array   
 +**/
 class PicaRecord { class PicaRecord {
-  // 15 dublin core elements http://dublincore.org/documents/dces/+  //  15 dublin core elements http://dublincore.org/documents/dces/
   var $contributor, $coverage, $creator, $date, $description, $format;   var $contributor, $coverage, $creator, $date, $description, $format;
   var $identifier, $language, $publisher, $related, $rights, $source;   var $identifier, $language, $publisher, $related, $rights, $source;
   var $subject, $title, $type;   var $subject, $title, $type;
-  // 1 for me+  //  1 for me
   var $signatur;   var $signatur;
  
 +  /*
 +    constructor
 +    class PicaRecord
 +    PHP5 or later should use '__construct()'
 +  **/
   function PicaRecord() {   function PicaRecord() {
-     //default values+     //  default values
      $this->type = "Text";      $this->type = "Text";
      $this->rights = "--";      $this->rights = "--";
Line 78: Line 155:
   }   }
  
-  /** private -- make pica data behave well */+  /* 
 +    private 
 +    class PicaRecord 
 +   *  make PICA data behave well and convert them to a XML structure 
 +    Used by PicaRecord->getXmlData 
 +  **/
   function decodePica($str) {   function decodePica($str) {
     $tag = "";     $tag = "";
Line 102: Line 184:
              break;              break;
  
-          case 226: //pica two byte char accent like "é";+          case 226: //PICA two byte char accent like "é";
              $ch = substr($str,++$i,1); // read one char ahead              $ch = substr($str,++$i,1); // read one char ahead
              $res .= $this->getCode2($ch);              $res .= $this->getCode2($ch);
Line 114: Line 196:
     }     }
     $res .= "</".$tag.">";     $res .= "</".$tag.">";
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** private -- make pica data behave well and put them to an array*/ +  /* 
-  function decodePica_array($str) {+    private 
 +    class PicaRecord 
 +   *  make PICA data behave well and put them to an array 
 +    Used by PicaRecord->getArray 
 +  **/ 
 +  function decodePicaArray($str) {
     $tag = "";     $tag = "";
     $res = "";     $res = "";
Line 131: Line 220:
           case 30: //information separator two, another field to follow           case 30: //information separator two, another field to follow
              break;              break;
-          case 226: //pica two byte char accent like "é";+          case 226: //PICA two byte char accent like "é";
              $ch = substr($str,++$i,1); // read one char ahead              $ch = substr($str,++$i,1); // read one char ahead
              $res[$tag] .= $this->getCode2($ch);              $res[$tag] .= $this->getCode2($ch);
Line 140: Line 229:
         } //switch         } //switch
     }     }
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- transform raw pica data to array */+  /* 
 +    public 
 +    class PicaRecord 
 +   *  transform raw PICA data to array 
 +    Used by Picappn->getArray 
 +  **/
   function getArray($str) {   function getArray($str) {
-     // pica record separator is ascii record separator +    //  PICA record separator is ascii record separator 
-     $lines = explode(chr(30), $str); +    $lines = explode(chr(30), $str); 
-     $res = ""; +    $res = ""; 
-     foreach ($lines as $line) { +    foreach ($lines as $line) { 
-       $in1 = ltrim($line); +      $in1 = ltrim($line); 
-       $ch1 = substr($in1,1,1); +      $ch1 = substr($in1,1,1); 
-       //first char between 0-9 +      //  first char between 0-9 
-       if (ord($ch1) >47 && ord($ch1)<58) { +      if (ord($ch1) >47 && ord($ch1)<58) { 
-          $pos = strpos($in1, ' '); +         $pos = strpos($in1, ' '); 
-          $key = substr($in1,0,$pos); +         $key = substr($in1,0,$pos); 
-          $val = substr($in1,$pos+1); +         $val = substr($in1,$pos+1); 
-          $val = $this->decodePica_array($val); +         $val = $this->decodePicaArray($val); 
-          $pica_array[$key] = $val; +         $pica_array[$key] = $val; 
-       } else { +      } else { 
-         //not valid +        //  not valid 
-       +      
-     +    
-     $res = $pica_array; +    $res = $pica_array; 
-     return $res;+ 
 +    //  return result 
 +    return $res;
   }   }
  
-  /** private -- recode pica charset */+  /* 
 +    public 
 +    class PicaRecord 
 +    return bibliographic data in array with speaking keys 
 +    Used by Picappn->{getBibTex,getCsv,getOpenUrlKev,getText} 
 +  **/ 
 +  function getArrayNice($array_raw) { 
 +    //  if $array_raw is empty just return 
 +    if (empty($array_raw)) return ""; 
 +    //  make variable name handier 
 +    $record = $array_raw; 
 + 
 +    //  get global, user-defineable variable $filter_nice 
 +    global $filter_nice; 
 + 
 +    //  type 
 +    $res['type'] = strtr($record['002@']['x0'], $filter_nice); 
 +    $res['_bibtex']['type'] = ''; 
 +    $res['_openurlkev']['type'] = 'rft.genre'; 
 +    $res['_text']['type'] = 'Art'; 
 +    //  type w/o kind of record 
 +    $res['twokr'] = substr($res['type'], 0, 2); 
 +    $res['_bibtex']['twokr'] = ''; 
 +    $res['_openurlkev']['twokr'] = ''; 
 +    $res['_text']['twokr'] = ''; 
 + 
 +    //  author 
 +    $res['author'] = strtr($record['028A']['x8'], $filter_nice); 
 +    $res['author'] = rtrim($res['author']); 
 +    $res['_bibtex']['author'] = '  author'; 
 +    $res['_openurlkev']['author'] = 'rft.au'; 
 +    $res['_text']['author'] = 'Autor'; 
 +    //  editor 
 +    $res['editor'] = strtr($record['028C']['x8'], $filter_nice); 
 +    $res['editor'] = rtrim($res['editor']); 
 +    $res['_bibtex']['editor'] = '  editor'; 
 +    $res['_openurlkev']['editor'] = 'rft.au'; 
 +    $res['_text']['editor'] = 'Herausgeber'; 
 + 
 +    //  title 
 +    $res['title'] = strtr($record['021A']['a'], $filter_nice); 
 +    $res['_bibtex']['title'] = '  title'; 
 +    $res['_openurlkev']['title'] = 'rft.title'; 
 +    $res['_text']['title'] = 'Titel'; 
 + 
 +    //  series 
 +    if ((!empty($record['036F']['x8'])) || (!empty($record['036F']['l']))) { 
 +      $res['series'] = strtr($record['036F']['x8'], $filter_nice)." ". 
 +       strtr($record['036F']['l'], $filter_nice); 
 +    } 
 +    $res['_bibtex']['series'] = '  series'; 
 +    $res['_openurlkev']['series'] = 'rft.series'; 
 +    $res['_text']['series'] = 'Schriftenreihe'; 
 + 
 +    //  address, especially city 
 +    $res['address'] = strtr($record['033A']['p'], $filter_nice); 
 +    $res['_bibtex']['address'] = '  address'; 
 +    $res['_openurlkev']['address'] = 'rft.place'; 
 +    $res['_text']['address'] = 'Ort'; 
 +    //  publisher 
 +    $res['publisher'] = strtr($record['033A']['n'], $filter_nice); 
 +    $res['_bibtex']['publisher'] = '  publisher'; 
 +    $res['_openurlkev']['publisher'] = 'rft.pub'; 
 +    $res['_text']['publisher'] = 'Verlag'; 
 + 
 +    //  edition 
 +    $res['edition'] = strtr($record['032@']['a'], $filter_nice); 
 +    $res['_bibtex']['edition'] = '  edition'; 
 +    $res['_openurlkev']['edition'] = 'rft.edition'; 
 +    $res['_text']['edition'] = 'Auflage'; 
 +    //  year 
 +    $res['year'] = strtr($record['011@']['a'], $filter_nice); 
 +    $res['_bibtex']['year'] = '  year'; 
 +    $res['_openurlkev']['year'] = 'rft.date'; 
 +    $res['_text']['year'] = 'Jahr'; 
 +    //  Erscheinungsverlauf 
 +    $res['everlauf'] = strtr($record['031@']['a'], $filter_nice); 
 +    $res['_bibtex']['everlauf'] = ''; 
 +    $res['_openurlkev']['everlauf'] = ''; 
 +    $res['_text']['everlauf'] = 'Erscheinungsverlauf'; 
 + 
 +    //  pages 
 +    $res['pages'] = strtr($record['034D']['a'], $filter_nice); 
 +    $res['_bibtex']['pages'] = ''; 
 +    $res['_openurlkev']['pages'] = 'rft.pages'; 
 +    $res['_text']['pages'] = 'Umfang'; 
 + 
 +    //  ISBNs 
 +    $res['isbn10'] = strtr($record['004A']['x0'], $filter_nice); 
 +    $res['_bibtex']['isbn10'] = '  isbn'; 
 +    $res['_openurlkev']['isbn10'] = 'rft.isbn'; 
 +    $res['_text']['isbn10'] = 'ISBN-10'; 
 +    $res['isbn13'] = strtr($record['004A']['A'], $filter_nice); 
 +    $res['_bibtex']['isbn13'] = '  isbn'; 
 +    $res['_openurlkev']['isbn13'] = 'rft.isbn'; 
 +    $res['_text']['isbn13'] = 'ISBN-13'; 
 + 
 +    //  ISSN 
 +    $res['issn'] = strtr($record['005A']['x0'], $filter_nice); 
 +    $res['_bibtex']['issn'] = '  issn'; 
 +    $res['_openurlkev']['issn'] = 'rft.issn'; 
 +    $res['_text']['issn'] = 'ISSN'; 
 + 
 +    //  DNB Number 
 +    $res['dnb_no'] = strtr($record['006G']['x0'], $filter_nice); 
 +    $res['_bibtex']['dnb_no'] = ''; 
 +    $res['_openurlkev']['dnb_no'] = ''; 
 +    $res['_text']['dnb_no'] = 'DNB-Nummer'; 
 + 
 +    //  OCLC Number 
 +    $res['oclc_no'] = strtr($record['003O']['x0'], $filter_nice); 
 +    $res['_bibtex']['oclc_no'] = ''; 
 +    $res['_openurlkev']['oclc_no'] = ''; 
 +    $res['_text']['oclc_no'] = 'OCLC-Nummer'; 
 + 
 +    //  Foreign Data Identification Number 
 +    $res['fdin'] = strtr($record['007I']['x0'], $filter_nice); 
 +    $res['_bibtex']['fdin'] = ''; 
 +    $res['_openurlkev']['fdin'] = ''; 
 +    $res['_text']['fdin'] = 'Fremddaten-Identifikationsnummer'; 
 + 
 +    //  ZDB identification number 
 +    $res['zdb_id'] = strtr($record['007A']['x0'], $filter_nice); 
 +    $res['_bibtex']['zdb_id'] = ''; 
 +    $res['_openurlkev']['zdb_id'] = ''; 
 +    $res['_text']['zdb_id'] = 'ZDB-ID'; 
 + 
 +    //  PPN 
 +    $res['ppn'] = strtr($record['003@']['x0'], $filter_nice); 
 +    $res['_bibtex']['ppn'] = '  note'; 
 +    $res['_openurlkev']['ppn'] = ''; 
 +    $res['_text']['ppn'] = 'PPN'; 
 + 
 +    //  Link 
 +    $res['link'] = strtr($record['009Q']['u'], $filter_nice); 
 +    $res['_bibtex']['link'] = 'URL'; 
 +    $res['_openurlkev']['link'] = ''; 
 +    $res['_text']['link'] = 'Link'; 
 + 
 +    //  Table of Contents 
 +    $res['toc'] = strtr($record['009P']['u'], $filter_nice); 
 +    $res['_bibtex']['toc'] = ''; 
 +    $res['_openurlkev']['toc'] = ''; 
 +    $res['_text']['toc'] = 'Inhaltsverzeichnis'; 
 + 
 +    //  DDC 
 +    $res['ddc'] = strtr($record['045B']['a'], $filter_nice); 
 +    $res['_bibtex']['ddc'] = ''; 
 +    $res['_openurlkev']['ddc'] = ''; 
 +    $res['_text']['ddc'] = 'DDC'; 
 + 
 +    //  RVK 
 +    $res['rvk'] = strtr($record['045Z']['a'], $filter_nice); 
 +    $res['_bibtex']['rvk'] = 'keywords'; 
 +    $res['_openurlkev']['rvk'] = ''; 
 +    $res['_text']['rvk'] = 'rvk'; 
 + 
 +    //  EZB link 
 +    $res['ezb_link'] = strtr($record['209S/01']['u'], $filter_nice); 
 +    $res['_bibtex']['ezb_link'] = '  url'; 
 +    $res['_openurlkev']['ezb_link'] = ''; 
 +    $res['_text']['ezb_link'] = 'EZB-Link'; 
 + 
 +    //  return result 
 +    return $res; 
 +  } 
 + 
 +  /* 
 +    private 
 +    class PicaRecord 
 +   *  recode PICA charset 
 +    Used by PicaRecord->{decodePica,decodePicaArray} 
 +  **/
   function getCode($ch) {   function getCode($ch) {
      $xx = ord($ch);      $xx = ord($ch);
Line 177: Line 447:
        // case 62: return "]";        // case 62: return "]";
        case 62: return "&gt;";        case 62: return "&gt;";
-       case 64: return ""; // @ pica no sort sign+       case 64: return ""; // @ PICA no sort sign
        case 209: return "ä";        case 209: return "ä";
        case 210: return "ö";        case 210: return "ö";
Line 193: Line 463:
   }   }
  
-  /** private -- not complete set of double byte pica characters started with +  /* 
-      an accent sign */+    private 
 +    class PicaRecord 
 +   *  not complete set of double byte PICA characters started with 
 +   *  an accent sign 
 +    Used by PicaRecord->{decodePica,decodePicaArray} 
 +  **/
   function getCode2($ch) {   function getCode2($ch) {
      switch($ch) {      switch($ch) {
Line 210: Line 485:
   }   }
  
-  /** public -- return simple dublin core record from pica data */ +  /* 
-  //used by unapi+    public 
 +    class PicaRecord 
 +   *  return simple Dublin Core record from PICA data 
 +    Used by Picappn->getDublinCore 
 +  **/
   function getDublinCore($str) {   function getDublinCore($str) {
     $res = $this->getXmlData($str); //parse dublin core     $res = $this->getXmlData($str); //parse dublin core
Line 235: Line 514:
     $res .= "<type>".$this->type."</type>\n";     $res .= "<type>".$this->type."</type>\n";
     $res .="</record>\n";     $res .="</record>\n";
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- transform raw pica plus to a more readable diagnostic format */ +  /* 
-  //used by unapi+    public 
 +    class PicaRecord 
 +   *  transform raw PICA plus to a more readable diagnostic format 
 +    Used by Picappn->getPicaPlus 
 +  **/
   function getPicaPlus($str) {   function getPicaPlus($str) {
     $res = $this->transcribe_pica_utf8($str);     $res = $this->transcribe_pica_utf8($str);
     $res = $this->transcribe_pica_rec($res);     $res = $this->transcribe_pica_rec($res);
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** private -- rename numeric tags not allowed in xml */+  /* 
 +    private 
 +    class PicaRecord 
 +   *  rename numeric tags not allowed in XML 
 +    Used by PicaRecord->{decodePica,decodePicaArray} 
 +  **/
   function getTagName($ch) {   function getTagName($ch) {
      if (ord($ch) >47 && ord($ch)<58) {      if (ord($ch) >47 && ord($ch)<58) {
Line 255: Line 547:
   }   }
  
-  /** public -- transform raw pica data to valid xml */ +  /* 
-  //used by unapi+    public 
 +    class PicaRecord 
 +   *  transform raw PICA data to valid XML 
 +    Used by PicaRecord->getDublinCore, 
 +   *  Picappn->{getDublinCoreRDF,getPlain,getXmlData} 
 +  **/
   function getXmlData($str) {   function getXmlData($str) {
-     // pica record separator is ascii record separator +    //  PICA record separator is ascii record separator 
-     $lines = explode(chr(30), $str); +    $lines = explode(chr(30), $str); 
-     $res = ""; + 
-     foreach ($lines as $line) { +    //  define $res 
-       $in1 = ltrim($line); +    $res = ""; 
-       $ch1 = substr($in1,1,1); + 
-       //first char between 0-9 +    //  check each element of array 
-       if (ord($ch1) >47 && ord($ch1)<58) { +    foreach ($lines as $line) { 
-          $pos = strpos($in1, ' '); +      $in1 = ltrim($line); 
-          $key = substr($in1,0,$pos); +      $ch1 = substr($in1,1,1); 
-          $val = substr($in1,$pos+1); +      //  first char between 0-9 
-          $val = $this->decodePica($val); +      if (ord($ch1) >47 && ord($ch1)<58) { 
-          //$res .= "[$key] [$val]\n"; +         $pos = strpos($in1, ' '); 
-          $res .= "<field tag=\"$key\">$val</field>\n"; +         $key = substr($in1,0,$pos); 
-          //side effect to scan dublin core elements +         $val = substr($in1,$pos+1); 
-          $this->readData($key,$val); +         $val = $this->decodePica($val); 
-       } else { +         //$res .= "[$key] [$val]\n"; 
-         //not valid +         $res .= "<field tag=\"$key\">$val</field>\n"; 
-       +         //side effect to scan dublin core elements 
-     +         $this->readData($key,$val); 
-     return $res;+      } else { 
 +        //not valid 
 +      
 +    
 + 
 +    //  return result 
 +    return $res;
   }   }
  
-  /** private -- read dublin core elements */+  /* 
 +    private 
 +    class PicaRecord 
 +   *  read Dublin Core elements 
 +    Used by PicaRecord->{getXmlData,readXmlData} 
 +  **/
   function readData($key, $val) {   function readData($key, $val) {
      //switch on first 4 letters to catch 041A/001      //switch on first 4 letters to catch 041A/001
Line 343: Line 651:
             break;             break;
        case '036D': //nicht dokumentiert: Sammelband Gesamtausgabe        case '036D': //nicht dokumentiert: Sammelband Gesamtausgabe
-            //source : A related resource from which the described is derived.+            //  source : A related resource from which the described is derived.
             $this->source = $this->readTag($val, "x8")." ";             $this->source = $this->readTag($val, "x8")." ";
-            //$this->source .= $this->readTag($val, "l"); 
             break;             break;
        case '045B': //DDC        case '045B': //DDC
Line 379: Line 686:
             break;             break;
        case '016A': //Materialspezifische Codes für elektronische Ressourcen        case '016A': //Materialspezifische Codes für elektronische Ressourcen
-            //type The nature or genre of the resource.+            //  type The nature or genre of the resource.
             $this->type = $this->readTag($val, "a");             $this->type = $this->readTag($val, "a");
             break;             break;
Line 388: Line 695:
   }   }
  
-  /** public -- parse dublin core data */ +  /* 
-  //client functionality +    public 
-  // comment out if using PHP4+    class PicaRecord 
 +   *  parse dublin core data 
 +   *  Used by unClient.php 
 +   *  **comment out if using PHP4** 
 +  **/
   function readDublinCore($str) {   function readDublinCore($str) {
-     $doc = new DomDocument(); +    $doc = new DomDocument(); 
-     $doc -> loadXML($str); +    $doc -> loadXML($str); 
-     $xp = new DomXPath($doc); +    $xp = new DomXPath($doc); 
-     $this->contributor = $xp->query("/record/contributor")->item(0)->nodeValue; +    $this->contributor = $xp->query("/record/contributor")->item(0)->nodeValue; 
-     $this->coverage = $xp->query("/record/coverage")->item(0)->nodeValue; +    $this->coverage = $xp->query("/record/coverage")->item(0)->nodeValue; 
-     $this->creator = $xp->query("/record/creator")->item(0)->nodeValue; +    $this->creator = $xp->query("/record/creator")->item(0)->nodeValue; 
-     $this->date = $xp->query("/record/date")->item(0)->nodeValue; +    $this->date = $xp->query("/record/date")->item(0)->nodeValue; 
-     $this->description = $xp->query("/record/description")->item(0)->nodeValue; +    $this->description = $xp->query("/record/description")->item(0)->nodeValue; 
-     $this->format = $xp->query("/record/format")->item(0)->nodeValue; +    $this->format = $xp->query("/record/format")->item(0)->nodeValue; 
-     $this->identifier = $xp->query("/record/identifier")->item(0)->nodeValue; +    $this->identifier = $xp->query("/record/identifier")->item(0)->nodeValue; 
-     $this->language = $xp->query("/record/language")->item(0)->nodeValue; +    $this->language = $xp->query("/record/language")->item(0)->nodeValue; 
-     $this->publisher = $xp->query("/record/publisher")->item(0)->nodeValue; +    $this->publisher = $xp->query("/record/publisher")->item(0)->nodeValue; 
-     $this->related = $xp->query("/record/related")->item(0)->nodeValue; +    $this->related = $xp->query("/record/related")->item(0)->nodeValue; 
-     $this->rights = $xp->query("/record/rights")->item(0)->nodeValue; +    $this->rights = $xp->query("/record/rights")->item(0)->nodeValue; 
-     $this->source = $xp->query("/record/source")->item(0)->nodeValue; +    $this->source = $xp->query("/record/source")->item(0)->nodeValue; 
-     $this->subject = $xp->query("/record/subject")->item(0)->nodeValue; +    $this->subject = $xp->query("/record/subject")->item(0)->nodeValue; 
-     $this->title = $xp->query("/record/title")->item(0)->nodeValue; +    $this->title = $xp->query("/record/title")->item(0)->nodeValue; 
-     $this->type = $xp->query("/record/type")->item(0)->nodeValue; +    $this->type = $xp->query("/record/type")->item(0)->nodeValue; 
-     return $res;+ 
 +    //  return result 
 +    return $res;
   }   }
  
-  /** public -- parse dublin core data */ +  /* 
-  //  experimental, does not work+    public 
 +    class PicaRecord 
 +   *  parse dublin core data 
 +   *  experimental, does not work, so commented out 
 +    Used by n/a 
 +  **/
   /*   /*
   function readRDF_DC($str) {   function readRDF_DC($str) {
-     $doc = new DomDocument(); +    $doc = new DomDocument(); 
-     $doc -> loadXML($str); +    $doc -> loadXML($str); 
-     $xp = new DomXPath($doc); +    $xp = new DomXPath($doc); 
-     $this->contributor = $xp->query("/rdf/dc:contributor")->item(0)->nodeValue; +    $this->contributor = $xp->query("/rdf/dc:contributor")->item(0)->nodeValue; 
-     $this->coverage = $xp->query("/rdf/dc:coverage")->item(0)->nodeValue; +    $this->coverage = $xp->query("/rdf/dc:coverage")->item(0)->nodeValue; 
-     $this->creator = $xp->query("/rdf/dc:creator")->item(0)->nodeValue; +    $this->creator = $xp->query("/rdf/dc:creator")->item(0)->nodeValue; 
-     $this->date = $xp->query("/rdf/dc:date")->item(0)->nodeValue; +    $this->date = $xp->query("/rdf/dc:date")->item(0)->nodeValue; 
-     $this->description = $xp->query("/rdf/dc:description")->item(0)->nodeValue; +    $this->description = $xp->query("/rdf/dc:description")->item(0)->nodeValue; 
-     $this->format = $xp->query("/rdf/dc:format")->item(0)->nodeValue; +    $this->format = $xp->query("/rdf/dc:format")->item(0)->nodeValue; 
-     $this->identifier = $xp->query("/rdf/dc:identifier")->item(0)->nodeValue; +    $this->identifier = $xp->query("/rdf/dc:identifier")->item(0)->nodeValue; 
-     $this->language = $xp->query("/rdf/dc:language")->item(0)->nodeValue; +    $this->language = $xp->query("/rdf/dc:language")->item(0)->nodeValue; 
-     $this->publisher = $xp->query("/rdf/dc:publisher")->item(0)->nodeValue; +    $this->publisher = $xp->query("/rdf/dc:publisher")->item(0)->nodeValue; 
-     $this->related = $xp->query("/rdf/dc:related")->item(0)->nodeValue; +    $this->related = $xp->query("/rdf/dc:related")->item(0)->nodeValue; 
-     $this->rights = $xp->query("/rdf/dc:rights")->item(0)->nodeValue; +    $this->rights = $xp->query("/rdf/dc:rights")->item(0)->nodeValue; 
-     $this->source = $xp->query("/rdf/dc:source")->item(0)->nodeValue; +    $this->source = $xp->query("/rdf/dc:source")->item(0)->nodeValue; 
-     $this->subject = $xp->query("/rdf/dc:subject")->item(0)->nodeValue; +    $this->subject = $xp->query("/rdf/dc:subject")->item(0)->nodeValue; 
-     $this->title = $xp->query("/rdf/dc:title")->item(0)->nodeValue; +    $this->title = $xp->query("/rdf/dc:title")->item(0)->nodeValue; 
-     $this->type = $xp->query("/rdf/dc:type")->item(0)->nodeValue; +    $this->type = $xp->query("/rdf/dc:type")->item(0)->nodeValue; 
-     return $res;+ 
 +    //  return result 
 +    return $res;
   }   }
   */   */
  
-  /** private -- read tag content from string */+  /* 
 +    private 
 +    class PicaRecord 
 +   *  read tag content from string 
 +    Used by PicaRecord->readData 
 +  **/
   function readTag($val, $tag) {   function readTag($val, $tag) {
      $x = strpos($val,"<".$tag.">");      $x = strpos($val,"<".$tag.">");
Line 447: Line 772:
   }   }
  
-  /** public -- read XML data */ +  /* 
-  // client functionality+    public 
 +    class PicaRecord 
 +   *  read XML data 
 +    used by unClient.php 
 +  **/
   function readXmlData($str) {   function readXmlData($str) {
      $lines = explode("\n", $str);      $lines = explode("\n", $str);
Line 468: Line 797:
   }   }
  
-  /** private -- transcribe separators to diagnostic format */+  /* 
 +    private 
 +    class PicaRecord 
 +   *  transcribe separators to diagnostic format 
 +    Used by PicaRecord->getPicaPlus 
 +  **/
   function transcribe_pica_rec($str) {   function transcribe_pica_rec($str) {
      return strtr( $str, array(      return strtr( $str, array(
Line 475: Line 809:
   }   }
  
-  /** private -- pica charset handling (we want utf8) */+  /* 
 +    private 
 +    class PicaRecord 
 +    PICA charset handling (we want utf8) 
 +    Used by PicaRecord->getPicaPlus 
 +  **/
   function transcribe_pica_utf8($str) {   function transcribe_pica_utf8($str) {
      return strtr( $str, array(      return strtr( $str, array(
Line 482: Line 821:
      ));      ));
   }   }
-} //end class PicaRecord+} 
 + 
 +/
 + *  end class PicaRecord 
 +**/
  
-/** get a pica record via pica xml web interface and return */+/* 
 +  class Picappn 
 + *  get a PICA record via PICA XML web interface, format and return it. 
 +  Supported formats: 
 +  - Array: Picappn->getArray 
 +  - Bibsonomy: Picappn->getBibsonomy 
 +  - BibTex: Picappn->getBibTex 
 +  - CSV: Picappn->getCsv 
 +  - Dublin Core: Picappn->getDublinCore 
 +  - RDF: Picappn->getDublinCoreRDF 
 +  - JSON: Picappn->getJson 
 +  - OpenURL KEV: Picappn->getOpenUrlKev 
 +  - PICA Plus: Picappn->getPicaPlus 
 +  - Plain: Picappn->getPlain 
 +  - Text: Picappn->getText 
 +  - XML: Picappn->getXmlData 
 +**/
 class Picappn { class Picappn {
-  // require php5-curl+  //  declare some attributes
   var $opac;   var $opac;
   var $url;   var $url;
Line 492: Line 851:
   var $myself;   var $myself;
  
-  var $prec; // a picarecord+  //  a picarecord 
 +  var $prec;
  
-  //constructor +  /
 +   *  constructor 
 +    class Picappn 
 +    PHP5 or later should use '__construct()' 
 +  **/
   function Picappn() {   function Picappn() {
-    //probably localhost on a typical pica psi production system+    //  get global user-defineable $opac_url
     global $opac_url;     global $opac_url;
 +
 +    //  preset some attributes
     $this->opac = $opac_url;     $this->opac = $opac_url;
     $this->ppn = 0;     $this->ppn = 0;
 +
 +    //  instantiate new PicaRecord()
     $this->prec = new PicaRecord();     $this->prec = new PicaRecord();
   }   }
  
-  /** public -- convert for output using raw array data*/+  /* 
 +    public 
 +    class Picappn 
 +   *  convert for output using raw array data 
 +    Used by Picappn->{getBibTex,getText} 
 +  **/
   function convOutput($array,$text,$separator,$category,$subfield,$suffix) {   function convOutput($array,$text,$separator,$category,$subfield,$suffix) {
 +    //  check if $array not empty, otherwise just return
     if (empty($array)) return "";     if (empty($array)) return "";
 +
 +    //  check if $subfield is given, otherwise just return category
     if (!empty($subfield)) {     if (!empty($subfield)) {
       if (empty($array[$category][$subfield])) return "";       if (empty($array[$category][$subfield])) return "";
-      $res = $text.$separator.$array[$category][$subfield].$suffix;+        $res = $text.$separator.$array[$category][$subfield].$suffix;
     } else {     } else {
       if (empty($array[$category])) return "";       if (empty($array[$category])) return "";
-      $res = $text.$separator.$array[$category].$suffix;+        $res = $text.$separator.$array[$category].$suffix;
     }     }
-    return $res; + 
 +    //  return result 
 +    return $res;
   }   }
  
-  /** public -- convert for output using nice array data*/+  /* 
 +    public 
 +    class Picappn 
 +   *  convert for output using nice array data 
 +    Used by Picappn->{getBibTex,getOpenUrlKev,getText} 
 +  **/
   function convOutputNice($array_nice,$array_text,$key,$prefix,$suffix) {   function convOutputNice($array_nice,$array_text,$key,$prefix,$suffix) {
 +    //  check if $array_nice not empty, otherwise just return
     if (empty($array_nice)) return "";     if (empty($array_nice)) return "";
 +    //  check if $array_nice[$key] not empty, otherwise just return
     if (empty($array_nice[$key])) return "";     if (empty($array_nice[$key])) return "";
 +
 +    //  build result
     $res = $array_text[$key].$prefix.$array_nice[$key].$suffix;     $res = $array_text[$key].$prefix.$array_nice[$key].$suffix;
-    return $res; + 
 +    //  return result 
 +    return $res;
   }   }
  
-  /** public -- return record as Array */+  /* 
 +    public 
 +    class Picappn 
 +   *  return record as Array 
 +    Used by Picappn->{getBibTex,getCsv,getJson,getOpenUrlKev,getText} 
 +  **/
   function getArray() {   function getArray() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  build result
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
     $res = $this->prec->getArray($res);     $res = $this->prec->getArray($res);
-    return $res; 
-  } 
- 
-  /** public -- return array with speaking keys */ 
-  function getArrayNice($array_raw) { 
-    if (empty($array_raw)) return ""; 
-    $record = $array_raw; 
- 
-    global $filter_nice; 
- 
-    //Type 
-    $res['type'] = strtr($record['002@']['x0'], $filter_nice); 
  
-    //Author +    //  return result
-    $res['author'] = strtr($record['028A']['x8'], $filter_nice); +
-    //Editor +
-    $res['editor'] = strtr($record['028C']['x8'], $filter_nice); +
- +
-    //Title +
-    $res['title'] = strtr($record['021A']['a'], $filter_nice); +
- +
-    //Series +
-    $res['series'] = strtr($record['036F']['x8'], $filter_nice)." ".strtr($record['036F']['l'], $filter_nice); +
- +
-    //Address, especially city +
-    $res['address'] = strtr($record['033A']['p'], $filter_nice); +
-    //Publisher +
-    $res['publisher'] = strtr($record['033A']['n'], $filter_nice); +
-    //Edition +
-    $res['edition'] = strtr($record['032@']['a'], $filter_nice); +
-    //Year +
-    $res['year'] = strtr($record['011@']['a'], $filter_nice); +
- +
-    //ISBNs +
-    $res['isbn10'] = strtr($record['004A']['x0'], $filter_nice); +
-    $res['isbn13'] = strtr($record['004A']['A'], $filter_nice); +
- +
-    //PPN +
-    $res['ppn'] = strtr($record['003@']['x0'], $filter_nice);+
     return $res;     return $res;
   }   }
  
-  /** public -- return BibTex record from pica data */ +  /* 
-  //used by bibsonomy+    public 
 +    class Picappn 
 +   *  return BibTeX record prefixed with $bibsonomy_url from PICA data
 +    Used by Bibsonomy.php 
 +  **/
   function getBibsonomy() {   function getBibsonomy() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
  
 +    //  get BibTeX-Record and URL-encode it
     $res = $this->getBibTex();     $res = $this->getBibTex();
     $res = urlencode($res);     $res = urlencode($res);
  
 +    /*
 +      prefix url-encoded BibTeX-Record and prefix it with global,
 +      user-defineable $bibsonomy_url
 +    **/
     global $bibsonomy_url;     global $bibsonomy_url;
     $res = $bibsonomy_url.$res;     $res = $bibsonomy_url.$res;
  
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return BibTex record from pica data */ +  /* 
-  //used by unapi+    public 
 +    class Picappn 
 +    Return BibTex record from pica data 
 +    Used by unAPI.php and Picappn->getBibsonomy 
 +  **/
   function getBibTex() {   function getBibTex() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  get pica data as array
     $record_raw = $this->getArray($this->ppn);     $record_raw = $this->getArray($this->ppn);
-    $record_nice = $this->getArrayNice($record_raw); +    //  transform raw to nice array 
-    $keys_nice = $this->getKeysBibTex();+    $record_nice = $this->prec->getArrayNice($record_raw); 
 +    //  get keys name from array 
 +    $keys_nice = $record_nice['_bibtex']; 
 +    //  declare $res 
 +    $res = "";
  
-    //make sure there is only one ISBN+    //  make sure there is only one ISBN, prefer isbn13 to isbn10
     if (!empty($record_nice['isbn13'])) unset($record_nice['isbn10']);     if (!empty($record_nice['isbn13'])) unset($record_nice['isbn10']);
  
-    if (substr($record_nice['type'], 0, 2== "Aa") { +    /* 
-      //Type+      check type and choose right BibTeX-type 
 +      "book" works quite well, "journal" not so 
 +    **/ 
 +    if (preg_match('/^[AO][aeEfF]$/',$record_nice['twokr'])) { 
 +      //  type: book
       $res = "@book {";       $res = "@book {";
  
-      //create identifier+      //  create identifier
       $res .= $this->convOutput($record_raw,"","",'003@','x0',"");       $res .= $this->convOutput($record_raw,"","",'003@','x0',"");
       $res .= $this->convOutput($record_raw,"","",'011@','a',",\n");       $res .= $this->convOutput($record_raw,"","",'011@','a',",\n");
  
-      //Author et al.+      //  set the field which are fetched: author et al.
       $i = array('author', 'editor', 'title', 'series', 'address', 'publisher',       $i = array('author', 'editor', 'title', 'series', 'address', 'publisher',
-        'edition', 'year', 'isbn10', 'isbn13');+        'edition', 'year', 'isbn10', 'isbn13', 'link');
  
 +      //  fetch them from array, format and output them
       foreach ($i as $j) {       foreach ($i as $j) {
         $res .= $this->convOutputNice($record_nice,$keys_nice,$j," = {","},\n");         $res .= $this->convOutputNice($record_nice,$keys_nice,$j," = {","},\n");
       }       }
  
-      //Call Number+      //  get call number, format and output it 
 +      $res .= $this->convOutput($record_raw,"  note"," = {","209A/01",'a',"}"); 
 +    } elseif (preg_match('/^[AO]b$/',$record_nice['twokr'])) { 
 +      //  type: journal 
 +      $res = "@misc {"; 
 + 
 +      //  create identifier 
 +      $res .= $this->convOutput($record_raw,"","",'003@','x0',""); 
 +      $res .= $this->convOutput($record_raw,"","",'011@','a',",\n"); 
 + 
 +      //  set the field which are fetched: title et al. 
 +      $i = array('title', 'address', 'publisher', 'issn', 'ezb_link'); 
 + 
 +      //  fetch them from array, format and output them 
 +      foreach ($i as $j) { 
 +        $res .= $this->convOutputNice($record_nice,$keys_nice,$j," = {","},\n"); 
 +      } 
 + 
 +      //  get call number, format and output it
       $res .= $this->convOutput($record_raw,"  note"," = {","209A/01",'a',"}");       $res .= $this->convOutput($record_raw,"  note"," = {","209A/01",'a',"}");
     }     }
-    $res .= "\n}";+ 
 +    //  stripping et al. 
 +    if (isset($res)) { 
 +      //  check if last characters of $res are ",\n" and trim them 
 +      $res = rtrim($res, ",\n"); 
 +      //  trailing element 
 +      $res .= "\n}"; 
 +    } 
 + 
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** private -- get data via pica xml interface */+  /* 
 +    public 
 +    class Picappn 
 +    Return CSV record from pica data 
 +    Used by unAPI.php 
 +  **/ 
 +  function getCsv() { 
 +    //  check if $this->ppn is not the preset value else return emptily 
 +    if ($this->ppn == 0) return ""; 
 + 
 +    //  get pica data as array 
 +    $record_raw = $this->getArray($this->ppn); 
 +    //  transform raw to nice array 
 +    $record_nice = $this->prec->getArrayNice($record_raw); 
 +    //  declare $res 
 +    $res = ''; 
 + 
 +    //  set categories to used for CSV 
 +    $i = array('ppn', 'author', 'editor', 'title', 'address', 'year', 'isbn10', 
 +     'isbn13', 'issn', 'dnb_no', 'oclc_no', 'fdin', 'zdb_id', 'rvk'); 
 + 
 +    //  fetch them from array, format and output them 
 +    foreach ($i as $j) { 
 +      $res .= '"'.$record_nice["$j"].'"|';  
 +    } 
 + 
 +    //  stripping et al. 
 +    if (isset($res)) { 
 +      //  check if last characters of $res are ",\n" and trim them 
 +      $res = rtrim($res, "|"); 
 +    } 
 + 
 +    //  return result 
 +    return $res; 
 +  } 
 + 
 +  /* 
 +    private 
 +    class Picappn 
 +   *  get data via PICA XML interface 
 +    Used by Picappn->{getArray,getDublinCore,getDublinCoreRDF,getPicaPlus,getPlain,getXmlData} 
 +  **/
   function getData($ppn) {   function getData($ppn) {
-    //check whether curl-Module is available, if not available use fallback +    // get global $use_curl as switch for the following conditional 
-    if (function_exists('curl_init')) {+    global $use_curl; 
 + 
 +    //  check whether curl-Module is available, if not available use fallback 
 +    if (function_exists('curl_init'&& $use_curl != 'no') {
       $ch = curl_init("$this->url");       $ch = curl_init("$this->url");
       curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);       curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
Line 633: Line 1091:
       $res = file_get_contents("$this->url");       $res = file_get_contents("$this->url");
     }     }
 +
 +    // return result
     return $res;     return $res;
   }   }
  
-  /** public -- return simple dublin core record data from pica record */+  /* 
 +    public 
 +    class Picappn 
 +   *  return simple dublin core record data from pica record 
 +    Used by unAPI.php 
 +  **/
   function getDublinCore() {   function getDublinCore() {
 +    //  retrieve data
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
 +
 +    //  format data
     $res = $this->prec->getDublinCore($res);     $res = $this->prec->getDublinCore($res);
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return dublin core rdf data from pica record */+  /* 
 +    public 
 +    class Picappn 
 +   *  return dublin core rdf data from pica record 
 +    Used by unAPI.php 
 +  **/
   function getDublinCoreRDF() {   function getDublinCoreRDF() {
 +    //  retrieve data
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
 +
 +    //  put it to some XML structure
     $res = $this->prec->getXmlData($res); //parses dublin core     $res = $this->prec->getXmlData($res); //parses dublin core
  
 +    //  check if $this->ppn is not the preset value else return emptily
     if (empty($res)) return "";     if (empty($res)) return "";
  
 +    //  format
     $res  = "<?xml version=\"1.0\"?>\n";     $res  = "<?xml version=\"1.0\"?>\n";
     $res .= "<!DOCTYPE rdf:RDF PUBLIC ";     $res .= "<!DOCTYPE rdf:RDF PUBLIC ";
Line 676: Line 1156:
     $res .= "</rdf:Description>\n";     $res .= "</rdf:Description>\n";
     $res .= "</rdf:RDF>\n";     $res .= "</rdf:RDF>\n";
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return JSON record from pica data */ +  /* 
-  //used by unapi+    public 
 +    class Picappn 
 +   *  return JSON record from pica data 
 +    Used by unAPI.php 
 +  **/
   function getJson() {   function getJson() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
  
 +    //  get PICA record as array
     $res = $this->getArray();     $res = $this->getArray();
-    //(PHP 5 >= 5.2.0, PECL json >= 1.2.0)+    //  encode array as JSON, requirements: PHP 5 >= 5.2.0, PECL json >= 1.2.0
     $res = json_encode($res);     $res = json_encode($res);
  
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return array with key names for BibTex*/ +  /* 
-  function getKeysBibTex() { +    public 
-    //Type +    class Picappn 
-    $res['type''Art';+   *  return OpenURL KEV record from pica data 
 +    Used by unAPI.php and Coins.php 
 +  **/ 
 +  function getOpenUrlKev() { 
 +    //  check if $this->ppn is not the preset value else return emptily 
 +    if ($this->ppn == 0) return "";
  
-    //Author +    //  get pica data as array 
-    $res['author' author'+    $record_raw $this->getArray($this->ppn); 
-    //Editor +    //  transform raw to nice array 
-    $res['editor'= '  editor';+    $record_nice = $this->prec->getArrayNice($record_raw)
 +    //  get keys' name from array 
 +    $keys_nice = $record_nice['_openurlkev']
 +    //  declare $res 
 +    $res = "";
  
-    //Title +    //  get global, user-defineable variable $rfr_id_hostname 
-    $res['title'] = '  title';+    global $rfr_id_hostname;
  
-    //Series +    //  set immutable context objects for OpenURL 
-    $res['series'= '  series';+    //  version of the ContextObject 
 +    $res .= 'ctx_ver=Z39.88-2004'
 +    //  referrer identifier 
 +    $res .= '&amp;rfr_id='.urlencode('info:sid/'.$rfr_id_hostname.':generator');
  
-    //Addressespecially city +    //  make sure there is only one ISBNprefer isbn13 to isbn10 
-    $res['address'= '  address'; +    if (!empty($record_nice['isbn13'])) unset($record_nice['isbn10']);
-    //Publisher +
-    $res['publisher'= '  publisher'; +
-    //Edition +
-    $res['edition'] = '  edition'; +
-    //Year +
-    $res['year'] = '  year';+
  
-    //ISBNs +    //  check type and choose right OpenURL-type 
-    $res['isbn10'isbn'; +    if (preg_match('/^[AO][aeEfF]$/',$record_nice['twokr'])) { 
-    $res['isbn13'] = '  isbn';+      //  make $keys_nice['title'] more standard compliant 
 +      $keys_nice['title'] = 'rft.btitle';
  
-    //PPN +      //  type: book 
-    $res['ppn'= '  note'; +      $res .= '&amp;rft_val_fmt='.urlencode('info:ofi/fmt:kev:mtx:book')
-    return $res; +      $res .= '&amp;rft.genre=book&amp;';
-  }+
  
-  /** public -- return array with key names for text*/ +      //  set the field which are fetched: author et al. 
-  function getKeysText() { +      $i = array('author''editor', 'title', 'series', 'address', 'publisher', 
-    //Type +        'edition', 'year', 'isbn10', 'isbn13', 'pages');
-    $res['type'] = 'Art';+
  
-    //Author +      //  fetch them from array, format, url-encode and output them 
-    $res['author'] = 'Autor'+      foreach ($i as $j) { 
-    //Editor +        $record_nice[$j] = urlencode($record_nice[$j]); 
-    $res['editor'] = 'Herausgeber';+        $res .= $this->convOutputNice($record_nice,$keys_nice,$j,"=","&amp;"); 
 +      } 
 +    } elseif (preg_match('/^[AO]b$/',$record_nice['twokr'])) { 
 +      //  type: journal/article 
 +      $res .= '&amp;rft_val_fmt='.urlencode('info:ofi/fmt:kev:mtx:journal'); 
 +      $res .= '&amp;rft.genre=article&amp;';
  
-    //Title +      //  set the field which are fetched: author et al. 
-    $res['title'] = 'Titel';+      $i = array('title', 'address', 'publisher', 'issn');
  
-    //Series +      //  fetch them from array, format, url-encode and output them 
-    $res['series'] = 'Schriftenreihe';+      foreach ($i as $j) { 
 +        $record_nice[$j] = urlencode($record_nice[$j]); 
 +        $res .= $this->convOutputNice($record_nice,$keys_nice,$j,"=","&amp;"); 
 +      } 
 +    }
  
-    //Address, especially city +    //  strip trailing "&amp;" if necessary 
-    $res['address'] = 'Ort'+    if (isset($res)) { 
-    //Publisher +      $res = rtrim($res, "&amp;")
-    $res['publisher'] = 'Verlag'; +    }
-    //Edition +
-    $res['edition''Auflage'; +
-    //Year +
-    $res['year'] = 'Jahr'; +
- +
-    //ISBNs +
-    $res['isbn10'] = 'ISBN-10'+
-    $res['isbn13'] = 'ISBN-13';+
  
-    //PPN +    //  return result
-    $res['ppn'] = 'PPN';+
     return $res;     return $res;
   }   }
  
-  /** public -- return formated pica plus record */+  /*  
 +    public 
 +    class Picappn 
 +   *  return formatted PICA Plus record 
 +    Used by unAPI.php 
 +  **/
   function getPicaPlus() {   function getPicaPlus() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  retrieve record
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
 +
 +    //  format
     $res = $this->prec->getPicaPlus($res);     $res = $this->prec->getPicaPlus($res);
 +
 +    //  set prefix
     $head = "<?xml version='1.0' encoding='UTF-8'?>\n";     $head = "<?xml version='1.0' encoding='UTF-8'?>\n";
     $head .= "<record url=\"$this->url\">\n";     $head .= "<record url=\"$this->url\">\n";
 +
 +    //  set suffix
     $tail = "</record>\n";     $tail = "</record>\n";
 +
 +    //  return result
     return $head.$res.$tail;     return $head.$res.$tail;
   }   }
  
-  /** public -- return formated plain record */+  /* 
 +    public 
 +    class Picappn 
 +   *  return formatted plain (not well formed XML) record 
 +    Used by unAPI.php 
 +  **/
   function getPlain() {   function getPlain() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  retrieve record
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
 +
 +    //  put to some XML structure
     $res = $this->prec->getXmlData($res);     $res = $this->prec->getXmlData($res);
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return simple text record from pica data */ +  /* 
-  //used by unapi+    public 
 +    class Picappn 
 +    Return simple text record from pica data 
 +    Used by unAPI.php 
 +  **/
   function getText() {   function getText() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  get pica data as array
     $record_raw = $this->getArray($this->ppn);     $record_raw = $this->getArray($this->ppn);
-    $record_nice = $this->getArrayNice($record_raw); +    //  transform raw to nice array 
-    $keys_nice = $this->getKeysText();+    $record_nice = $this->prec->getArrayNice($record_raw); 
 +    //  get keys' names from array 
 +    $keys_nice = $record_nice['_text']; 
 +    //  declare $res
     $res = "";     $res = "";
  
-    if (substr($record_nice['type'], 0, 2== "Aa") { +    //  check type and choose right type 
-      //Type +    if (preg_match('/^[AO][aeEfF]$/',$record_nice['twokr'])) { 
-      $res .= "Art:\t\tMonographie\n";+      //  type: book 
 +      $res .= $keys_nice['type'].":\t\tMonographie\n";
  
-      //Author +      //  set the field which are fetched: author et al. 
-      $res .$this->convOutputNice($record_nice,$keys_nice,"author",":\t\t","\n"); +      $array('author''editor''title''series', 'address', 'publisher'
-      //Editor +        'edition', 'year', 'isbn10', 'isbn13', 'pages', 'rvk', 'ddc', 'link', 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"editor",":\t","\n");+        'toc''ppn''dnb_no''oclc_no''fdin');
  
-      //Title +      //  fetch them from array, format and output them 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"title",":\t\t","\n");+      foreach ($i as $j) { 
 +        $res .= $this->convOutputNice($record_nice,$keys_nice,$j,":\t\t","\n"); 
 +      }
  
-      //Series +      //  call number 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"series",":\t","\n");+      $i = 1; 
 +      $j = 0; 
 +      while ( $i <= 99 ) { 
 +        if (($i <= 9) && ($j == 0)) { 
 +          $j = "0".$i; 
 +        } elseif (($i > 9) && ($j == 0)) { 
 +          $j = $i; 
 +        } 
 +        $res .= $this->convOutput($record_raw,"Signatur",":\t","209A/$j",'a',"\n")
 +        $i++; 
 +        if ($i <= 9 ) { 
 +          $j = "0".$i; 
 +        } else { 
 +          $j = $i; 
 +        } 
 +        if (empty($record_raw["209A/$j"]['a'])) break; 
 +      } 
 +    } elseif (preg_match('/^[AO]b$/',$record_nice['twokr'])) { 
 +      //  type: journal 
 +      $res .= $keys_nice['type'].":\t\tZeitschrift\n";
  
-      //Address, especially city +      //  set the field which are fetched: title et al. 
-      $res .$this->convOutputNice($record_nice,$keys_nice,"address",":\t\t","\n"); +      $array('title''address''publisher''issn''everlauf''rvk'
-      //Publisher +        'zdb_id''ppn''ezb_link');
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"publisher",":\t\t","\n"); +
-      //Edition +
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"edition",":\t","\n"); +
-      //Year +
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"year",":\t\t","\n");+
  
-      //ISBNs +      //  fetch them from array, format and output them 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"isbn10",":\t","\n"); +      foreach ($i as $j{ 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"isbn13",":\t","\n");+        $res .= $this->convOutputNice($record_nice,$keys_nice,$j,":\t\t","\n"); 
 +      }
  
-      //Call Number+      //  call number
       $i = 1;       $i = 1;
       $j = 0;       $j = 0;
Line 833: Line 1383:
         if (empty($record_raw["209A/$j"]['a'])) break;         if (empty($record_raw["209A/$j"]['a'])) break;
       }       }
- 
-      $res .= $this->convOutputNice($record_nice,$keys_nice,"ppn",":\t\t","\n"); 
     }     }
 +
 +    //  return result
     return $res;     return $res;
   }   }
  
-  /** public -- return xml formated pica record */+  /* 
 +    public 
 +    class Picappn 
 +   *  return XML formatted PICA record 
 +    Used by unAPI.php 
 +  **/
   function getXmlData() {   function getXmlData() {
 +    //  check if $this->ppn is not the preset value else return emptily
     if ($this->ppn == 0) return "";     if ($this->ppn == 0) return "";
 +
 +    //  retrieve record
     $res = $this->getData($this->ppn);     $res = $this->getData($this->ppn);
-    $res = $this->prec->getXmlData($res); + 
 +    //  put it to some XML structure 
 +    $res = $this->prec->getXmlData($res); 
 + 
 +    //  define prefix
     $head = "<?xml version='1.0' ?>\n";     $head = "<?xml version='1.0' ?>\n";
     //$head .= "<record>\n";     //$head .= "<record>\n";
Line 851: Line 1413:
     //$head .= "<record url=\"".$this->opac.$this->ppn."\">\n";     //$head .= "<record url=\"".$this->opac.$this->ppn."\">\n";
     $head .= "<record url=\"".htmlentities($this->url)."\">\n";     $head .= "<record url=\"".htmlentities($this->url)."\">\n";
 +
 +    //  define suffix
     $tail = "</record>\n";     $tail = "</record>\n";
 +
 +    //  return result
     return $head.$res.$tail;     return $head.$res.$tail;
   }   }
  
-  //public+  /*  public 
 +    class Picappn 
 +    set attribute Picappn->opac 
 +    Used by n/a 
 +  **/
   function setOpac($opac) {   function setOpac($opac) {
     $this->opac = $opac;     $this->opac = $opac;
   }   }
  
-  //public -- set ppn, the unapi identifier+  /*  public 
 +    class Picappn 
 +   *  set PPN, the unAPI identifier 
 +    Used by Bibsonomy.php, Coins.php and unAPI.php 
 +  **/
   function setPpn($ppn) {   function setPpn($ppn) {
-    $this->ppn = $ppn; +    //  get global, user-defineable $pattern_ppn 
-    $this->url = $this->opac.$ppn."&PLAIN=ON";+    global $pattern_ppn; 
 + 
 +    /*   
 +      for input sanitising - check if $ppn can be matched against a regex 
 +      which defines allowed input, if correct set some attributes 
 +    **/ 
 +    if (preg_match($pattern_ppn,$ppn)) { 
 +      $this->ppn = $ppn; 
 +      $this->url = $this->opac.$ppn."&PLAIN=ON"; 
 +    } else { 
 +      //  for debugging only 
 +      //echo foo; 
 +    }
     $this->myself = $_SERVER['PHP_SELF'];     $this->myself = $_SERVER['PHP_SELF'];
   }   }
 +}
  
-} //end class Picappn+/
 + *  end class Picappn 
 +**/
  
-/* Return result or 404 */+/*  
 +  function final_result 
 + *  Return result or 404 
 +  Used by unAPI.php 
 +**/
 function final_result($res, $content_type) { function final_result($res, $content_type) {
 +  /*  if $res is not empty, return it, otherwise act accordingly to unAPI
 +    specification
 +  **/
   if (!empty($res)) {   if (!empty($res)) {
 +    //  send header
     header("Content-type: $content_type");     header("Content-type: $content_type");
 +    //  return result
     echo $res;     echo $res;
   } else {   } else {
Line 878: Line 1476:
   }   }
 } }
 +
 +/*
 +  end function final_result
 +**/
  
 ?> ?>
 </code> </code>
  
 +Former name of this file was [[PicaRecord.php]]
buechereielektrik/unapi/unapi.inc.php.txt · Last modified: 2011-01-20 17:12 by strols
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0