mirror of
https://github.com/msikma/pokesprite.git
synced 2026-03-21 17:54:23 -05:00
294 lines
9.6 KiB
PHP
294 lines
9.6 KiB
PHP
<?php
|
|
|
|
// PokéSprite
|
|
// ----------
|
|
// The use of this source code is governed by the MIT license.
|
|
// See the COPYRIGHT file for more information.
|
|
|
|
namespace PkSpr;
|
|
|
|
/**
|
|
* Used to display program usage information.
|
|
*
|
|
* Requires an external template file to determine what to display.
|
|
*/
|
|
class Usage extends TemplateFormatter
|
|
{
|
|
/** @var string[] Arguments that require a value. */
|
|
public static $ARG_REQ = array(
|
|
'dir-icons:', 'dir-data:', 'file-data:', 'file-icons-data:',
|
|
'dir-output:', 'file-output-img-tmp:', 'file-output-img:',
|
|
'file-output-scss:', 'file-output-html:', 'file-output-md:',
|
|
'tpl-scss:', 'tpl-html:', 'css-base-sel:', 'css-shiny-sel:',
|
|
'css-female-sel:', 'css-right-sel:', 'css-inline-sel:',
|
|
'css-block-sel:', 'path-pngcrush:', 'dir-pkmn:', 'dir-resources:',
|
|
'pkmn-lang:', 'lang:',
|
|
// Undocumented (debugging only):
|
|
'pkmn-range:',
|
|
);
|
|
/** @var string[] Arguments that may have a value. */
|
|
public static $ARG_OPT = array(
|
|
'include-right::',
|
|
'file-exts::',
|
|
'icon-sets::',
|
|
);
|
|
/** @var string[] Arguments that can have no value. */
|
|
public static $ARG_NONE = array(
|
|
'exclude-pkmn', 'exclude-shiny', 'exclude-regular', 'exclude-forms',
|
|
'exclude-icon-sets', 'verbose', 'monochrome', 'help', 'no-pngcrush',
|
|
'generate-markdown', 'no-padding', 'exclude-special-icons', 'version',
|
|
// Undocumented (debugging only):
|
|
'html-no-slugs',
|
|
);
|
|
|
|
/** @var mixed[] Settings parsed from the command-line options. */
|
|
public $opt_settings = array();
|
|
|
|
/** @var boolean Whether the user should be shown the usage overview. */
|
|
public $needs_usage = false;
|
|
/** @var boolean Whether the user should be shown the version number. */
|
|
public $needs_version = false;
|
|
/** @var boolean Whether invalid or unknown arguments were passed. */
|
|
public $argument_error = false;
|
|
/** @var string|null Error identifier. */
|
|
public $error_id = null;
|
|
|
|
/**
|
|
* Returns command-line arguments.
|
|
*
|
|
* @return mixed[] Command-line arguments.
|
|
*/
|
|
private function get_opts()
|
|
{
|
|
// Only long-style options are supported.
|
|
$long = array_merge(
|
|
static::$ARG_REQ,
|
|
static::$ARG_OPT,
|
|
static::$ARG_NONE
|
|
);
|
|
$opts = getopt('', $long);
|
|
return $opts;
|
|
}
|
|
|
|
/**
|
|
* Analyzes the user's passed command-line arguments and makes
|
|
* a determination of whether the user invoked the script correctly.
|
|
*/
|
|
private function parse_opts()
|
|
{
|
|
// The user's arguments will create a settings file that can
|
|
// be used to directly overwrite the current settings.
|
|
$s = array();
|
|
// Whether an argument error has occurred.
|
|
$argument_error = false;
|
|
// Error explanation identifier.
|
|
$error_id = 'arg_error_unknown';
|
|
|
|
$opts = $this->get_opts();
|
|
|
|
// Iterate over the command-line arguments.
|
|
foreach ($opts as $arg => $val) {
|
|
if ($arg == 'help') {
|
|
$this->needs_usage = true;
|
|
break;
|
|
}
|
|
if ($arg == 'version') {
|
|
$this->needs_version = true;
|
|
break;
|
|
}
|
|
if ($arg == 'monochrome') {
|
|
$s['debug_monochrome'] = true;
|
|
}
|
|
if ($arg == 'verbose') {
|
|
$s['debug_img_inclusion'] = true;
|
|
}
|
|
if ($arg == 'exclude-icon-sets') {
|
|
$s['include_icon_sets'] = false;
|
|
}
|
|
if ($arg == 'exclude-special-icons') {
|
|
$s['include_special_icons'] = false;
|
|
}
|
|
if ($arg == 'exclude-forms') {
|
|
$s['include_pkmn_forms'] = false;
|
|
}
|
|
if ($arg == 'exclude-shiny') {
|
|
$s['include_pkmn_shiny'] = false;
|
|
}
|
|
if ($arg == 'exclude-regular') {
|
|
$s['include_pkmn_nonshiny'] = false;
|
|
}
|
|
if ($arg == 'exclude-pkmn') {
|
|
$s['include_pkmn'] = false;
|
|
}
|
|
if ($arg == 'no-pngcrush') {
|
|
$s['generate_optimized'] = false;
|
|
}
|
|
if ($arg == 'no-padding') {
|
|
$s['pkmn_img_padding'] = 0;
|
|
}
|
|
if ($arg == 'generate-markdown') {
|
|
$s['generate_markdown'] = true;
|
|
}
|
|
if ($arg == 'html-no-slugs') {
|
|
$s['html_no_slugs'] = true;
|
|
}
|
|
if ($arg == 'include-right') {
|
|
$val_int = intval($val);
|
|
if (!is_numeric($val) || $val_int < 0 || $val_int > 2) {
|
|
$argument_error = true;
|
|
$error_id = 'arg_error_include_right';
|
|
break;
|
|
}
|
|
$s['include_pkmn_right'] = $val_int;
|
|
}
|
|
if ($arg == 'icon-sets') {
|
|
$val = trim(trim($val), ',');
|
|
if ($val != '') {
|
|
$val = explode(',', $val);
|
|
}
|
|
if (empty($val)) {
|
|
$argument_error = true;
|
|
$error_id = 'arg_error_icon_sets';
|
|
break;
|
|
}
|
|
$s['etc_icon_sets'] = $val;
|
|
}
|
|
if ($arg == 'file-exts') {
|
|
$val = explode(',', trim(trim($val), ','));
|
|
if (empty($val)) {
|
|
$argument_error = true;
|
|
$error_id = 'arg_error_file_exts';
|
|
break;
|
|
}
|
|
$s['file_exts'] = $val;
|
|
}
|
|
}
|
|
|
|
// When not adding Pokémon icons, exclude the special icons too.
|
|
if ($s['include_pkmn'] === false) {
|
|
$s['include_special_icons'] = false;
|
|
}
|
|
|
|
// These are settings values that are directly replaced by the values
|
|
// of the command-line arguments.
|
|
$var_replacements = array(
|
|
'path-pngcrush' => 'pngcrush_path',
|
|
'tpl-html' => 'html_tpl',
|
|
'tpl-scss' => 'scss_tpl',
|
|
'dir-resources' => 'resources_dir',
|
|
'file-output-html' => 'html_output',
|
|
'file-output-md' => 'md_output',
|
|
'file-output-scss' => 'scss_output',
|
|
'file-output-img' => 'img_output',
|
|
'file-output-img-tmp' => 'img_output_tmp',
|
|
'dir-output' => 'dir_output',
|
|
'file-data' => 'file_pkmn_data',
|
|
'file-icons' => 'file_icon_data',
|
|
'dir-data' => 'dir_data',
|
|
'dir-pkmn' => 'dir_pkmn',
|
|
'dir-icons' => 'dir_base',
|
|
'pkmn-range' => 'pkmn_range',
|
|
'icon-range' => 'icon_range',
|
|
'pkmn-lang' => 'pkmn_language',
|
|
'lang' => 'i18n_language',
|
|
);
|
|
foreach ($opts as $arg => $val) {
|
|
if (in_array($arg, array_keys($var_replacements))) {
|
|
$var = $var_replacements[$arg];
|
|
$s[$var] = $val;
|
|
}
|
|
}
|
|
// Check for the language setting: set the slug language to the
|
|
// Pokémon name language by default. However, if romanized Japanese
|
|
// names are requested (jpn_ro), the slug language should be jpn.
|
|
if (isset($s['pkmn_language'])) {
|
|
$s['pkmn_language_slugs'] = $s['pkmn_language'];
|
|
}
|
|
if ($s['pkmn_language'] == 'jpn_ro') {
|
|
$s['pkmn_language_slugs'] = 'jpn';
|
|
}
|
|
|
|
if ($argument_error == true) {
|
|
$this->needs_usage = true;
|
|
}
|
|
|
|
$this->opt_settings = $s;
|
|
$this->argument_error = $argument_error;
|
|
$this->error_id = $error_id;
|
|
}
|
|
|
|
/**
|
|
* Returns an array of user-defined settings to override the
|
|
* current settings with, based on passed command-line arguments.
|
|
*
|
|
* @return mixed[] Settings array populated by command-line arguments.
|
|
*/
|
|
public function get_user_settings()
|
|
{
|
|
if (empty($this->opt_settings)) {
|
|
$this->parse_opts();
|
|
}
|
|
|
|
return $this->opt_settings;
|
|
}
|
|
|
|
/**
|
|
* Trims the usage template prior to its decoration for proper display.
|
|
*/
|
|
private function trim_usage_tpl()
|
|
{
|
|
$this->tpl = "\n".trim($this->tpl)."\n\n";
|
|
}
|
|
|
|
/**
|
|
* Displays the version number.
|
|
*/
|
|
public function display_version()
|
|
{
|
|
$usage_vars = array(
|
|
'website' => Settings::get('website'),
|
|
'revision' => Settings::get('revision'),
|
|
'version' => Settings::get('version'),
|
|
);
|
|
$trmfrm = new TerminalFormatter();
|
|
$this->render($usage_vars);
|
|
$usage = $this->get_buffer();
|
|
$usage = $trmfrm->format($usage);
|
|
print($usage);
|
|
}
|
|
|
|
/**
|
|
* Displays the program usage.
|
|
*/
|
|
public function display_usage()
|
|
{
|
|
$this->trim_usage_tpl();
|
|
|
|
// Retrieve the proper error string in case we've got an error.
|
|
if ($this->argument_error) {
|
|
$error_str = I18n::lf('arg_error_tpl',
|
|
array(I18n::l($this->error_id))
|
|
);
|
|
}
|
|
|
|
$usage_vars = array(
|
|
'website' => Settings::get('website'),
|
|
'revision' => Settings::get('revision'),
|
|
'version' => Settings::get('version'),
|
|
'error' => $error_str,
|
|
'copyright' => (
|
|
Settings::get('copyright_str').
|
|
"\n".Settings::get('copyright_gf')
|
|
),
|
|
);
|
|
|
|
// We'll replace variables and finally format the output
|
|
// for use in a terminal.
|
|
$trmfrm = new TerminalFormatter();
|
|
$this->render($usage_vars);
|
|
$usage = $this->get_buffer();
|
|
$usage = $trmfrm->format($usage);
|
|
print($usage);
|
|
}
|
|
}
|