sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.8 KiB
126 lines
3.8 KiB
<?php
|
|
|
|
namespace Dotenv;
|
|
|
|
use Dotenv\Exception\InvalidFileException;
|
|
|
|
class Parser
|
|
{
|
|
const INITIAL_STATE = 0;
|
|
const QUOTED_STATE = 1;
|
|
const ESCAPE_STATE = 2;
|
|
const WHITESPACE_STATE = 3;
|
|
const COMMENT_STATE = 4;
|
|
|
|
/**
|
|
* Parse the given variable name.
|
|
*
|
|
* @param string $name
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function parseName($name)
|
|
{
|
|
return trim(str_replace(array('export ', '\'', '"'), '', $name));
|
|
}
|
|
|
|
/**
|
|
* Parse the given variable value.
|
|
*
|
|
* @param string $value
|
|
*
|
|
* @throws \Dotenv\Exception\InvalidFileException
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function parseValue($value)
|
|
{
|
|
if ($value === '') {
|
|
return '';
|
|
} elseif ($value[0] === '"' || $value[0] === '\'') {
|
|
return Parser::parseQuotedValue($value);
|
|
} else {
|
|
return Parser::parseUnquotedValue($value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Parse the given quoted value.
|
|
*
|
|
* @param string $value
|
|
*
|
|
* @throws \Dotenv\Exception\InvalidFileException
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function parseQuotedValue($value)
|
|
{
|
|
$data = array_reduce(str_split($value), function ($data, $char) use ($value) {
|
|
switch ($data[1]) {
|
|
case Parser::INITIAL_STATE:
|
|
if ($char === '"' || $char === '\'') {
|
|
return array($data[0], Parser::QUOTED_STATE);
|
|
} else {
|
|
throw new InvalidFileException(
|
|
'Expected the value to start with a quote.'
|
|
);
|
|
}
|
|
case Parser::QUOTED_STATE:
|
|
if ($char === $value[0]) {
|
|
return array($data[0], Parser::WHITESPACE_STATE);
|
|
} elseif ($char === '\\') {
|
|
return array($data[0], Parser::ESCAPE_STATE);
|
|
} else {
|
|
return array($data[0].$char, Parser::QUOTED_STATE);
|
|
}
|
|
case Parser::ESCAPE_STATE:
|
|
if ($char === $value[0] || $char === '\\') {
|
|
return array($data[0].$char, Parser::QUOTED_STATE);
|
|
} else {
|
|
return array($data[0].'\\'.$char, Parser::QUOTED_STATE);
|
|
}
|
|
case Parser::WHITESPACE_STATE:
|
|
if ($char === '#') {
|
|
return array($data[0], Parser::COMMENT_STATE);
|
|
} elseif (!ctype_space($char)) {
|
|
throw new InvalidFileException(
|
|
'Dotenv values containing spaces must be surrounded by quotes.'
|
|
);
|
|
} else {
|
|
return array($data[0], Parser::WHITESPACE_STATE);
|
|
}
|
|
case Parser::COMMENT_STATE:
|
|
return array($data[0], Parser::COMMENT_STATE);
|
|
}
|
|
}, array('', Parser::INITIAL_STATE));
|
|
|
|
return trim($data[0]);
|
|
}
|
|
|
|
/**
|
|
* Parse the given unquoted value.
|
|
*
|
|
* @param string $value
|
|
*
|
|
* @throws \Dotenv\Exception\InvalidFileException
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function parseUnquotedValue($value)
|
|
{
|
|
$parts = explode(' #', $value, 2);
|
|
$value = trim($parts[0]);
|
|
|
|
// Unquoted values cannot contain whitespace
|
|
if (preg_match('/\s+/', $value) > 0) {
|
|
// Check if value is a comment (usually triggered when empty value with comment)
|
|
if (preg_match('/^#/', $value) > 0) {
|
|
$value = '';
|
|
} else {
|
|
throw new InvalidFileException('Dotenv values containing spaces must be surrounded by quotes.');
|
|
}
|
|
}
|
|
|
|
return trim($value);
|
|
}
|
|
}
|
|
|