walldeblan.deb/usr/bin/walldeblan
2015-03-02 21:51:04 +01:00

171 lines
3.9 KiB
PHP
Executable file

#!/usr/bin/php
<?php
class WallException extends Exception {}
class Wall
{
private $curl = null;
private $language = 'html';
private $code = null;
private $title = null;
private $showLines = true;
private static $instance = null;
public static function getInstance()
{
return (self::$instance === null) ? self::$instance = new Wall() : self::$instance;
}
public function __construct()
{
$this->curl = curl_init();
}
public function setCode($code)
{
$this->code = $code;
return $this;
}
public function setCodeFromFile($file)
{
$this->code = (file_exists($file) && is_readable($file)) ? file_get_contents($file) : '';
return $this;
}
public function getCode()
{
return $this->code;
}
public function setLanguage($language)
{
$this->language = $language;
return $this;
}
public function getLanguage()
{
return $this->language;
}
public function setTitle($title)
{
$this->title = $title;
return $this;
}
public function getTitle()
{
return $this->title;
}
public function setShowLines($showLines)
{
$this->showLines = (bool) $showLines;
return $this;
}
public function getShowLines()
{
return $this->showLines;
}
public function paste()
{
$options = array(
CURLOPT_URL => 'https://wall.deblan.org',
CURLOPT_HEADER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(array(
'code' => $this->getCode(),
'language' => $this->getLanguage(),
'title' => $this->getTitle(),
'line' => $this->getShowLines()
))
);
curl_setopt_array($this->curl, $options);
$header = curl_exec($this->curl);
if (curl_errno($this->curl)) {
throw new WallException('Curl error: '.curl_error($this->curl));
} else {
$http_code = curl_getinfo($this->curl, CURLINFO_HTTP_CODE);
if (in_array($http_code, array(301, 302, 200))) {
preg_match('`location: ([^\s]+)`i', $header, $matches);
return 'https://wall.deblan.org'.trim(array_pop($matches));
} else {
throw new WallException(sprintf('HTTP header error: unexpected response code (%s)', $http_code));
}
}
}
}
function getHelp()
{
global $argv;
return <<<EOH
$argv[0] <file> [language]
Using "-" as filename for stdin.
Available languages:
"html" for HTML
"xml" for XML
"css" for CSS
"javascript" for JAVASCRIPT
"php" for PHP
"sql" for SQL
"yaml" for YAML
"perl" for PERL
"c" for C/C++
"asp" for ASP
"python" for PYTHON
"bash" for BASH
"actionscript" for ACTION SCRIPT
"texte" for TEXTE
EOH;
}
try {
if (!isset($argv[1])) {
throw new InvalidArgumentException('I miss the first parameter...');
}
Wall::getInstance()->setLanguage(isset($argv[2]) ? $argv[2] : 'texte');
if ($argv[1] == '-') {
$handle = fopen('php://stdin', 'r');
$code = "";
while (!feof($handle)) {
$code.= rtrim(fgets($handle)).PHP_EOL;
}
Wall::getInstance()->setCode($code);
} else {
Wall::getInstance()->setCodeFromFile($argv[1]);
}
echo Wall::getInstance()->paste(), PHP_EOL;
} catch (WallException $e) {
echo 'WALL ERROR: '.$e->getMessage();
echo getHelp();
} catch (Exception $e) {
echo 'SCRIPT ERROR: ', $e->getMessage(), PHP_EOL;
echo getHelp();
}