summaryrefslogtreecommitdiff
path: root/bridges/ElsevierBridge.php
blob: f6ba7ddba8ad5f03b63ae87c57dac5ab124bbce4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
class ElsevierBridge extends BridgeAbstract {

	const MAINTAINER = 'Pierre Mazière';
	const NAME = 'Elsevier journals recent articles';
	const URI = 'http://www.journals.elsevier.com/';
	const CACHE_TIMEOUT = 43200; //12h
	const DESCRIPTION = 'Returns the recent articles published in Elsevier journals';

	const PARAMETERS = array( array(
		'j' => array(
			'name' => 'Journal name',
			'required' => true,
			'exampleValue' => 'academic-pediactrics',
			'title' => 'Insert html-part of your journal'
		)
	));

	// Extracts the list of names from an article as string
	private function extractArticleName($article){
		$names = $article->find('small', 0);
		if($names)
			return trim($names->plaintext);
		return '';
	}

	// Extracts the timestamp from an article
	private function extractArticleTimestamp($article){
		$time = $article->find('.article-info', 0);
		if($time) {
			$timestring = trim($time->plaintext);
			/*
				The format depends on the age of an article:
				- Available online 29 July 2016
				- July 2016
				- May–June 2016
			*/
			if(preg_match('/\S*(\d+\s\S+\s\d{4})/ims', $timestring, $matches)) {
				return strtotime($matches[0]);
			} elseif (preg_match('/[A-Za-z]+\-([A-Za-z]+\s\d{4})/ims', $timestring, $matches)) {
				return strtotime($matches[0]);
			} elseif (preg_match('/([A-Za-z]+\s\d{4})/ims', $timestring, $matches)) {
				return strtotime($matches[0]);
			} else {
				return 0;
			}
		}
		return 0;
	}

	// Extracts the content from an article
	private function extractArticleContent($article){
		$content = $article->find('.article-content', 0);
		if($content) {
			return trim($content->plaintext);
		}
		return '';
	}

	public function collectData(){
		$uri = self::URI . $this->getInput('j') . '/recent-articles/';
		$html = getSimpleHTMLDOM($uri)
			or returnServerError('No results for Elsevier journal ' . $this->getInput('j'));

		foreach($html->find('.pod-listing') as $article) {
			$item = array();
			$item['uri'] = $article->find('.pod-listing-header>a', 0)->getAttribute('href') . '?np=y';
			$item['title'] = $article->find('.pod-listing-header>a', 0)->plaintext;
			$item['author'] = $this->extractArticleName($article);
			$item['timestamp'] = $this->extractArticleTimestamp($article);
			$item['content'] = $this->extractArticleContent($article);
			$this->items[] = $item;
		}
	}
}