/** * Convert a simple option list into a dict. For example: * * legs=4, eyes=2 * * ...becomes: * * array( * 'legs' => '4', * 'eyes' => '2', * ); * * @param string Input option list. * @return dict Parsed dictionary. * @task parse */ public function parse($input) { $result = array(); $lexer = new PhutilSimpleOptionsLexer(); $tokens = $lexer->getNiceTokens($input); $state = 'key'; $pairs = array(); foreach ($tokens as $token) { list($type, $value) = $token; switch ($state) { case 'key': if ($type != 'word') { return array(); } if (!strlen($value)) { return array(); } $key = $this->normalizeKey($value); $state = '='; break; case '=': if ($type == '=') { $state = 'value'; break; } if ($type == ',') { $pairs[] = array($key, true); $state = 'key'; break; } return array(); case 'value': if ($type == ',') { $pairs[] = array($key, null); $state = 'key'; break; } if ($type != 'word') { return array(); } $pairs[] = array($key, $value); $state = ','; break; case ',': if ($type == 'word') { $pair = array_pop($pairs); $pair[1] .= $value; $pairs[] = $pair; break; } if ($type != ',') { return array(); } $state = 'key'; break; } } if ($state == '=') { $pairs[] = array($key, true); } if ($state == 'value') { $pairs[] = array($key, null); } $result = array(); foreach ($pairs as $pair) { list($key, $value) = $pair; if ($value === null) { unset($result[$key]); } else { $result[$key] = $value; } } return $result; }
private function getNiceTokens($input) { $lexer = new PhutilSimpleOptionsLexer(); return $lexer->getNiceTokens($input); }