summaryrefslogtreecommitdiff
path: root/vendor/vlucas/phpdotenv/src/Parser/Lines.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/vlucas/phpdotenv/src/Parser/Lines.php')
-rw-r--r--vendor/vlucas/phpdotenv/src/Parser/Lines.php127
1 files changed, 127 insertions, 0 deletions
diff --git a/vendor/vlucas/phpdotenv/src/Parser/Lines.php b/vendor/vlucas/phpdotenv/src/Parser/Lines.php
new file mode 100644
index 0000000..6497993
--- /dev/null
+++ b/vendor/vlucas/phpdotenv/src/Parser/Lines.php
@@ -0,0 +1,127 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Dotenv\Parser;
+
+use Dotenv\Util\Regex;
+use Dotenv\Util\Str;
+
+final class Lines
+{
+ /**
+ * This class is a singleton.
+ *
+ * @codeCoverageIgnore
+ *
+ * @return void
+ */
+ private function __construct()
+ {
+ //
+ }
+
+ /**
+ * Process the array of lines of environment variables.
+ *
+ * This will produce an array of raw entries, one per variable.
+ *
+ * @param string[] $lines
+ *
+ * @return string[]
+ */
+ public static function process(array $lines)
+ {
+ $output = [];
+ $multiline = false;
+ $multilineBuffer = [];
+
+ foreach ($lines as $line) {
+ [$multiline, $line, $multilineBuffer] = self::multilineProcess($multiline, $line, $multilineBuffer);
+
+ if (!$multiline && !self::isCommentOrWhitespace($line)) {
+ $output[] = $line;
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Used to make all multiline variable process.
+ *
+ * @param bool $multiline
+ * @param string $line
+ * @param string[] $buffer
+ *
+ * @return array{bool,string,string[]}
+ */
+ private static function multilineProcess(bool $multiline, string $line, array $buffer)
+ {
+ $startsOnCurrentLine = $multiline ? false : self::looksLikeMultilineStart($line);
+
+ // check if $line can be multiline variable
+ if ($startsOnCurrentLine) {
+ $multiline = true;
+ }
+
+ if ($multiline) {
+ \array_push($buffer, $line);
+
+ if (self::looksLikeMultilineStop($line, $startsOnCurrentLine)) {
+ $multiline = false;
+ $line = \implode("\n", $buffer);
+ $buffer = [];
+ }
+ }
+
+ return [$multiline, $line, $buffer];
+ }
+
+ /**
+ * Determine if the given line can be the start of a multiline variable.
+ *
+ * @param string $line
+ *
+ * @return bool
+ */
+ private static function looksLikeMultilineStart(string $line)
+ {
+ return Str::pos($line, '="')->map(static function () use ($line) {
+ return self::looksLikeMultilineStop($line, true) === false;
+ })->getOrElse(false);
+ }
+
+ /**
+ * Determine if the given line can be the start of a multiline variable.
+ *
+ * @param string $line
+ * @param bool $started
+ *
+ * @return bool
+ */
+ private static function looksLikeMultilineStop(string $line, bool $started)
+ {
+ if ($line === '"') {
+ return true;
+ }
+
+ return Regex::occurrences('/(?=([^\\\\]"))/', \str_replace('\\\\', '', $line))->map(static function (int $count) use ($started) {
+ return $started ? $count > 1 : $count >= 1;
+ })->success()->getOrElse(false);
+ }
+
+ /**
+ * Determine if the line in the file is a comment or whitespace.
+ *
+ * @param string $line
+ *
+ * @return bool
+ */
+ private static function isCommentOrWhitespace(string $line)
+ {
+ $line = \trim($line);
+
+ return $line === '' || (isset($line[0]) && $line[0] === '#');
+ }
+}