source: pmb4.2/trunk/fuentes/pmb/classes/rdf/arc2/parsers/ARC2_RSSParser.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 5.5 KB
Line 
1<?php
2/*
3homepage: http://arc.semsol.org/
4license:  http://arc.semsol.org/license
5
6class:    ARC2 RSS Parser
7author:   Benjamin Nowack
8version:  2010-11-16
9*/
10
11ARC2::inc('LegacyXMLParser');
12
13class ARC2_RSSParser extends ARC2_LegacyXMLParser {
14
15  function __construct($a, &$caller) {
16    parent::__construct($a, $caller);
17  }
18 
19  function __init() {/* reader */
20    parent::__init();
21    $this->triples = array();
22    $this->target_encoding = '';
23    $this->t_count = 0;
24    $this->added_triples = array();
25    $this->skip_dupes = false;
26    $this->bnode_prefix = $this->v('bnode_prefix', 'arc'.substr(md5(uniqid(rand())), 0, 4).'b', $this->a);
27    $this->bnode_id = 0;
28    $this->cache = array();
29    $this->allowCDataNodes = 0;
30  }
31 
32  /*  */
33 
34  function done() {
35    $this->extractRDF();
36  }
37 
38  /*  */
39 
40  function setReader(&$reader) {
41    $this->reader = $reader;
42  }
43 
44  function createBnodeID(){
45    $this->bnode_id++;
46    return '_:' . $this->bnode_prefix . $this->bnode_id;
47  }
48 
49  function addT($t) {
50    //if (!isset($t['o_datatype']))
51    if ($this->skip_dupes) {
52      $h = md5(serialize($t));
53      if (!isset($this->added_triples[$h])) {
54        $this->triples[$this->t_count] = $t;
55        $this->t_count++;
56        $this->added_triples[$h] = true;
57      }
58    }
59    else {
60      $this->triples[$this->t_count] = $t;
61      $this->t_count++;
62    }
63  }
64
65  function getTriples() {
66    return $this->v('triples', array());
67  }
68
69  function countTriples() {
70    return $this->t_count;
71  }
72 
73  function getSimpleIndex($flatten_objects = 1, $vals = '') {
74    return ARC2::getSimpleIndex($this->getTriples(), $flatten_objects, $vals);
75  }
76
77  /*  */
78
79  function extractRDF() {
80    $index = $this->getNodeIndex();
81    $this->rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
82    $this->rss = 'http://purl.org/rss/1.0/';
83    $this->dc = 'http://purl.org/dc/elements/1.1/';
84    $this->dct = 'http://purl.org/dc/terms/';
85    $this->content = 'http://purl.org/rss/1.0/modules/content/';
86    $this->enc = 'http://purl.oclc.org/net/rss_2.0/enc#';
87    $this->mappings = array(
88      'channel' => $this->rss . 'channel',
89      'item' => $this->rss . 'item',
90      'title' => $this->rss . 'title',
91      'link' => $this->rss . 'link',
92      'description' => $this->rss . 'description',
93      'guid' => $this->dc . 'identifier',
94      'author' => $this->dc . 'creator',
95      'category' => $this->dc . 'subject',
96      'pubDate' => $this->dc . 'date',
97      'pubdate' => $this->dc . 'date',
98      'source' => $this->dc . 'source',
99      'enclosure' => $this->enc . 'enclosure',
100    );
101    $this->dt_props = array(
102      $this->dc . 'identifier',
103      $this->rss . 'link'
104    );
105    foreach ($index as $p_id => $nodes) {
106      foreach ($nodes as $pos => $node) {
107        $tag = $this->v('tag', '', $node);
108        if ($tag == 'channel') {
109          $struct = $this->extractChannel($index[$node['id']]);
110          $triples = ARC2::getTriplesFromIndex($struct);
111          foreach ($triples as $t) {
112            $this->addT($t);
113          }
114        }
115        elseif ($tag == 'item') {
116          $struct = $this->extractItem($index[$node['id']]);
117          $triples = ARC2::getTriplesFromIndex($struct);
118          foreach ($triples as $t) {
119            $this->addT($t);
120          }
121        }
122      }
123    }
124  }
125 
126  function extractChannel($els) {
127    $res = array($this->rdf . 'type' => array(array('value' => $this->rss . 'channel', 'type' => 'uri')));
128    $res = array_merge($res, $this->extractProps($els, 'channel'));
129    return array($res[$this->rss . 'link'][0]['value'] => $res);
130  }
131 
132  function extractItem($els) {
133    $res = array($this->rdf . 'type' => array(array('value' => $this->rss . 'item', 'type' => 'uri')));
134    $res = array_merge($res, $this->extractProps($els, 'item'));
135    if (isset($res[$this->rss . 'link'])) return array($res[$this->rss . 'link'][0]['value'] => $res);
136    if (isset($res[$this->dc . 'identifier'])) return array($res[$this->dc . 'identifier'][0]['value'] => $res);
137  }
138 
139  function extractProps($els, $container) {
140    $res = array();
141    foreach ($els as $info) {
142      /* key */
143      $tag = $info['tag'];
144      if (!preg_match('/^[a-z0-9]+\:/i', $tag)) {
145        $k = isset($this->mappings[$tag]) ? $this->mappings[$tag] : '';
146      }
147      else {
148        $k = $tag;
149      }
150      if (($container == 'channel') && ($k == $this->rss . 'item')) continue;
151      /* val */
152      $v = $info['cdata'];
153      if (!$v) $v = $this->v('url', '', $info['a']);
154      if (!$v) $v = $this->v('href', '', $info['a']);
155      /* prop */
156      if ($k) {
157        /* enclosure handling */
158        if ($k == $this->enc . 'enclosure') {
159          $sub_res = array();
160          foreach (array('length', 'type') as $attr) {
161            if ($attr_v = $this->v($attr, 0, $info['a'])) {
162              $sub_res[$this->enc . $attr] = array(array('value' => $attr_v, 'type' => 'literal'));
163            }
164          }
165          $struct[$v] = $sub_res;
166        }
167        /* date handling */
168        if (in_array($k, array($this->dc . 'date', $this->dct . 'modified'))) {
169          if (!preg_match('/^[0-9]{4}/', $v) && ($sub_v = strtotime($v)) && ($sub_v != -1)) {
170            $tz = date('Z', $sub_v); /* timezone offset */
171            $sub_v -= $tz; /* utc */
172            $v = date('Y-m-d\TH:i:s\Z', $sub_v);
173          }
174        }
175        if (!isset($res[$k])) $res[$k] = array();
176        $res[$k][] = array('value' => $v, 'type' => in_array($k, $this->dt_props) || !preg_match('/^[a-z0-9]+\:[^\s]+$/is', $v) ? 'literal' : 'uri');
177      }
178    }
179    return $res;
180  }
181 
182  /*  */
183
184 
185}
Note: See TracBrowser for help on using the repository browser.