WebCollage/src/Collector.php

121 lines
3.7 KiB
PHP

<?php
namespace Shikiryu\WebGobbler;
abstract class Collector
{
/**
* Collector constructor.
*
* @param \Shikiryu\WebGobbler\Pool $pool
*/
public function __construct(Pool $pool)
{
$this->pool = $pool;
}
/**
* @return string
*/
abstract public function getName();
/**
* @return string
*/
public function getPoolDirectory()
{
return sprintf('%s/%s', $this->pool->getPoolDirectory(), $this->getName());
}
/**
* @return int
*/
abstract public function getRandomImage();
/**
* @param int $number
*
* @return int
*/
abstract public function getRandomImages(int $number);
/**
* Generates a random word.
* This method can be used by all derived classes.
* Usefull to get random result from search engines when you do not have
* a dictionnary at hand.
* The generated word can be a number (containing only digits),
* a word (containing only letters) or both mixed.
* Output: string (a random word)
*
* @return string
*/
protected function generateRandomWord()
{
$word = '1';
try {
if (random_int(0, 100) < 30) { // Sometimes use only digits
if (random_int(0, 100) < 30) {
$word = random_int(1, 999);
} else {
$word = random_int(1, 999999);
}
} else { // Generate a word containing letters
$word = '';
$charset = 'abcdefghijklmnopqrstuvwxyz'; // Search for random word containing letter only.
if (random_int(0, 100) < 60) { // Sometimes include digits with letters
$charset = 'abcdefghijklmnopqrstuvwxyz' . 'abcdefghijklmnopqrstuvwxyz' . '0123456789'; // *2 to have more letters than digits
}
$charset = str_split($charset);
for ($i = 0, $l = random_int(2, 5); $i <= $l; $i++) { // Only generate short words (2 to 5 characters)
$word .= $charset[array_rand($charset)];
}
}
} catch (\Exception $e) {
}
return $word;
}
/**
* @param array $parts
*
* @return string
*/
protected function reverse_url(array $parts) {
if (array_key_exists('query', $parts) && is_array($parts['query'])) {
$parts['query'] = http_build_query($parts['query']);
}
return (isset($parts['scheme']) ? "{$parts['scheme']}:" : '') .
((isset($parts['user']) || isset($parts['host'])) ? '//' : '') .
(isset($parts['user']) ? "{$parts['user']}" : '') .
(isset($parts['pass']) ? ":{$parts['pass']}" : '') .
(isset($parts['user']) ? '@' : '') .
(isset($parts['host']) ? "{$parts['host']}" : '') .
(isset($parts['port']) ? ":{$parts['port']}" : '') .
(isset($parts['path']) ? "{$parts['path']}" : '') .
(isset($parts['query']) ? "?{$parts['query']}" : '') .
(isset($parts['fragment']) ? "#{$parts['fragment']}" : '');
}
/**
* @param \Shikiryu\WebGobbler\Pool $pool
*
* @return \Shikiryu\WebGobbler\Collector[]
*/
public static function getAllCollectors(Pool $pool)
{
$collectors = [];
foreach (glob(__DIR__ . '/Collector/*.php') as $class) {
$classname = sprintf('Shikiryu\\WebGobbler\\Collector\\%s', basename($class, '.php'));
$tmp_class = new $classname($pool);
if (is_subclass_of($tmp_class, __CLASS__)) {
$collectors[] = $tmp_class;
}
}
return $collectors;
}
}