Browse Source

A little more porting

master
J. King 2 years ago
parent
commit
aebe1da0d2
  1. 18
      lib/Docopt.php

18
lib/Docopt.php

@ -19,7 +19,7 @@ namespace MensBeam\Docopt;
* - A set in Python is roughly equivalent to array_unique($arr) in PHP, but this depends on the types of the contents
*/
class Docopt {
abstract class Docopt {
# __version__ = "0.7.2"
public const VERSION = "0.7.2";
@ -73,7 +73,7 @@ class Docopt {
* @param bool $options_first Set to True to require options precede positional arguments, i.e. to forbid options and positional arguments intermix
* @param bool $more_magic Try to be extra-helpful; offer advanced pattern-matching and spellcheck
*/
public function docopt(
public static function docopt(
string $docstring, // DEVIATION: Our docstring is not optional since we can't get one from the parent context
$argv = null,
bool $default_help = true,
@ -122,7 +122,7 @@ class Docopt {
# raise DocoptLanguageError('"usage:" section (case-insensitive) not found. Perhaps missing indentation?')
# if len(usage_sections) > 1:
# raise DocoptLanguageError('More than one "usage:" (case-insensitive).')
$usage_sections = Util::parse_section("usage:", $docstring);
$usage_sections = Parser::parse_section("usage:", $docstring);
if (sizeof($usage_sections) === 0) {
throw new DocoptLanguageError('"usage:" section (case-insensitive) not found. Perhaps missing indentation?');
}
@ -140,6 +140,10 @@ class Docopt {
# options = parse_defaults(docstring)
# pattern = parse_pattern(formal_usage(DocoptExit.usage), options)
# pattern_options = set(pattern.flat(Option))
DocoptExit::$usage = $usage_sections[0];
$options = Parser::parse_defaults($docstring);
$pattern = Parser::parse_pattern(Parser::formal_usage(DocoptExit::$usage), $options);
$pattern_options = array_unique($pattern->flat(Options::class));
# for options_shortcut in pattern.flat(OptionsShortcut):
# doc_options = parse_defaults(docstring)
# options_shortcut.children = [opt for opt in doc_options if opt not in pattern_options]
@ -160,17 +164,17 @@ class Docopt {
# magic = magic_docopt = docopt
/** Helper function to invoke the docopt() method with $more_magic always true */
public function magic(string $docstring, $argv = null, bool $default_help = true, $version = null, bool $options_first = false, bool $more_magic = false): ParsedOptions {
public static function magic(string $docstring, $argv = null, bool $default_help = true, $version = null, bool $options_first = false, bool $more_magic = false): ParsedOptions {
return static::docopt($docstring, $argv, $default_help, $version, $options_first, true);
}
/** Helper function to invoke the docopt() method with $more_magic always true */
public function magic_docopt(string $docstring, $argv = null, bool $default_help = true, $version = null, bool $options_first = false, bool $more_magic = false): ParsedOptions {
public static function magic_docopt(string $docstring, $argv = null, bool $default_help = true, $version = null, bool $options_first = false, bool $more_magic = false): ParsedOptions {
return static::docopt($docstring, $argv, $default_help, $version, $options_first, true);
}
}
class Util {
abstract class Parser {
# def levenshtein_norm(source: str, target: str) -> float:
# """Calculates the normalized Levenshtein distance between two string
# arguments. The result will be a float in the range [0.0, 1.0], with 1.0
@ -563,7 +567,7 @@ class BranchPattern extends Pattern {
public function fix_repeating_arguments(): self {
# either = [list(child.children) for child in transform(self).children]
$either = [];
foreach (Util::transform($this)->children as $child) {
foreach (Parser::transform($this)->children as $child) {
$either[] = (array) $child->children;
}
# for case in either:

Loading…
Cancel
Save