{"id":18772513,"url":"https://github.com/eftec/clione","last_synced_at":"2026-02-01T21:36:10.486Z","repository":{"id":37520397,"uuid":"451623797","full_name":"EFTEC/CliOne","owner":"EFTEC","description":"A minimanist PHP library to manage the Command Line operations (CLI)","archived":false,"fork":false,"pushed_at":"2024-12-30T19:59:12.000Z","size":1262,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-16T17:19:46.719Z","etag":null,"topics":["cli","command-line","php"],"latest_commit_sha":null,"homepage":"https://www.escuelainformatica.cl","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EFTEC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-24T20:33:36.000Z","updated_at":"2024-12-30T19:59:16.000Z","dependencies_parsed_at":"2025-04-13T08:48:05.548Z","dependency_job_id":null,"html_url":"https://github.com/EFTEC/CliOne","commit_stats":null,"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"purl":"pkg:github/EFTEC/CliOne","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FCliOne","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FCliOne/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FCliOne/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FCliOne/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EFTEC","download_url":"https://codeload.github.com/EFTEC/CliOne/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EFTEC%2FCliOne/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260654643,"owners_count":23042676,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","command-line","php"],"created_at":"2024-11-07T19:29:21.656Z","updated_at":"2026-02-01T21:36:10.479Z","avatar_url":"https://github.com/EFTEC.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CliOne\r\n\r\nThis library helps to create command line (CLI) operator for PHP in Windows, Mac and Linux\r\n\r\n[![Packagist](https://img.shields.io/packagist/v/eftec/CliOne.svg)](https://packagist.org/packages/eftec/CliOne)\r\n[![Total Downloads](https://poser.pugx.org/eftec/CliOne/downloads)](https://packagist.org/packages/eftec/CliOne)\r\n[![Maintenance](https://img.shields.io/maintenance/yes/2025.svg)]()\r\n[![composer](https://img.shields.io/badge/composer-%3E1.6-blue.svg)]()\r\n[![php](https://img.shields.io/badge/php-7.4-green.svg)]()\r\n[![php](https://img.shields.io/badge/php-8.4-green.svg)]()\r\n[![CocoaPods](https://img.shields.io/badge/docs-70%25-yellow.svg)]()\r\n\r\n## Features\r\n\r\n✅ Windows, Linux and Mac Compatible.\r\n\r\n✅ This library truly minimalist and simple, it only consists of 2 classes and nothing more and no external dependency.\r\n\r\n✅ Arguments \u0026 user input\r\n\r\n✅ This library was aimed to (optionally) fallback to user-input if the argument is missing.\r\n\r\n✅ Colors available\r\n\r\n✅ The design is mostly fluent (it adjusts to the width of the screen)\r\n\r\n✅ Validation of values\r\n\r\n✅ Support NO_COLOR environment variable. See https://no-color.org/\r\n\r\n![](docs/examplecomplete.jpg)\r\n\r\n## Getting started\r\n\r\nAdd the library using composer:\r\n\r\n\u003e composer require eftec/clione\r\n\r\nAnd create a new instance of the library\r\n\r\n```php\r\n$cli=new CliOne(); // instance of the library\r\n```\r\n\r\n## Usage\r\n\r\nFor example, let's say we need to create a CLI code to read an information and save into a file.\r\n\r\n```shell\r\n\u003ephp basic.php read -o result.json\r\n```\r\n\r\nWe have two arguments, the first (read) is in the first position, and it doesn't have any \"-\". The second is \"-o\" that\r\nit is our flag with a value.\r\n\r\nSo we could create our arguments.\r\n\r\n```php\r\n$cli=new CliOne();\r\n$cli-\u003ecreateParam('read',[],'first')-\u003eadd(); // a positional argument (the first one) value-less\r\n$cli-\u003ecreateParam('o',[],'flag')-\u003eadd(); // a simple flag \"-o\"\r\n```\r\n\r\nAnd we could evaluate as\r\n\r\n```php\r\n$cli-\u003eevalParam('read');\r\n$cli-\u003eevalParam('o');\r\n// So we could obtain our values as:\r\nvar_dump($cli-\u003egetParameter('read')-\u003evalue); \r\nvar_dump($cli-\u003egetParameter('o')-\u003evalue);\r\n// or as\r\nvar_dump($cli-\u003egetValue('read'));\r\nvar_dump($cli-\u003egetValue('o'));\r\n```\r\n\r\nIt will return **false** if we don't set a value, and it will return the value it we set it.\r\n\r\n```shell\r\n\u003ephp basic.php read -o result.json\r\nstring(4) \"read\"\r\nstring(11) \"result.json\"\r\n```\r\n\r\n\u003e **The parameters are created and evaluated separately because it allows to do more powerful operations with it.**\r\n\u003e\r\n\u003e For example, sometimes we want to show the help (the list of parameters available) without evaluating the parameters.\r\n\r\nOk, but now what if we want to create an alias of \"-o\"\r\n\r\n```php\r\nvar_dump($cli-\u003egetParameter('o',['output','outputresult'])-\u003evalue);\r\n```\r\n\r\nSo we could call using this line\r\n\r\n```shell\r\nphp basic.php read --output result.json\r\n# or also\r\nphp basic.php read --outputresult result.json\r\n# or also\r\nphp basic.php read -o=result.json\r\n```\r\n\r\n\u003e **If the parameter is a flag, then the alias is a longflag (\"--\"). If the parameter is a longflag then the alias is a\r\nflag.**\r\n\r\nBut let's say we need to ask for a password, however we want to be entered interactively.\r\n\r\n```php\r\n$cli-\u003ecreateParam('pwd',[],'flag') // we create the parameter\r\n    -\u003esetInput(true,'password') // and we ask (if the parameter is not entered as flag) \r\n                                //for user input of the type password (however the password is not hidden visually)\r\n    -\u003eadd();\r\n$cli-\u003eevalParam('pwd');   // and don't forget to evaluate the parameter\r\n```\r\n\r\nSo it will look like:\r\n\r\n```shell\r\n\u003e php .\\basic.php read -o result.json\r\nSelect the value of pwd [*****] :123\r\n```\r\n\r\nNow, let's say something more advanced, multiple options, we want to select the type of file: json, csv, html and xml\r\n\r\nOur code\r\n\r\n```php\r\n$cli-\u003ecreateParam('type',[],'flag')\r\n    -\u003esetInput(true,'option',['json','csv','xml','html'])\r\n    -\u003eadd();\r\n```\r\n\r\nAnd the result:\r\n\r\n```shell\r\nPS \u003e php .\\basic.php read -o result.json\r\nSelect the value of pwd [*****] :111\r\n[1] json                     \r\n[2] csv                      \r\n[3] xml                      \r\n[4] html                     \r\nSelect the value of type [] :2 #you could use TAB key for autocomplete, cool!\r\n```\r\n\r\n\u003e **List of values are divided in two values, the visual value (simply called value), and the key-value.**. In this\r\n\u003e example, \"csv\" is a value and its key-value is \"2\".\r\n\u003e\r\n\u003e The list of values allows associative arrays and indexed arrays. Indexed arrays are renumbered to start in 1.\r\n\r\nYou could also enter\r\n\r\n\u003e php .\\basic.php read -o result.json -pwd 123 -type json\r\n\r\nNow, you can show the parameters (\"show the syntax help\") as follows:\r\n\r\n```php\r\n$cli-\u003eshowParamSyntax2('parameters:');\r\n```\r\n\r\nBut it will look plain.\r\n\r\nIt is because you can add a description, change the question and add more help information\r\n\r\n```php\r\n$cli-\u003ecreateParam('type',[],'flag')\r\n    -\u003esetDescription('it is the type of output','what is the option?',['it is the help1','example: -option xml'])\r\n    -\u003esetInput(true,'option',['json','csv','xml','html'])\r\n    -\u003eadd();\r\n```\r\n\r\nSo it will look like: (in colors)\r\n\r\n```shell\r\nparameters:\r\nread                         The command [read]\r\n-o, --output, --outputresult The output file without extension [result.json]\r\n                             example: -o file\r\n-pwd                         It is the password [*****]\r\n-type                        it is the type of output [csv]\r\n                             it is the help1\r\n                             example: -option xml\r\n```\r\n\r\nThere are more operations available but the basic is there.\r\n\r\n# Table of contents\r\n\r\n\u003c!-- TOC --\u003e\r\n* [CliOne](#clione)\r\n  * [Features](#features)\r\n  * [Getting started](#getting-started)\r\n  * [Usage](#usage)\r\n* [Table of contents](#table-of-contents)\r\n  * [Flow](#flow)\r\n  * [Input as arguments](#input-as-arguments)\r\n  * [Input interactive](#input-interactive)\r\n    * [User input (interactive)](#user-input-interactive)\r\n    * [Customize user input](#customize-user-input)\r\n  * [CliOne Class](#clione-class)\r\n    * [Method __construct()](#method-__construct)\r\n      * [Parameters:](#parameters)\r\n    * [Method getWindowsVersion()](#method-getwindowsversion)\r\n    * [Method instance()](#method-instance)\r\n      * [Parameters:](#parameters-1)\r\n    * [Method hasInstance()](#method-hasinstance)\r\n    * [Method hasMenu()](#method-hasmenu)\r\n    * [Method clearMenu()](#method-clearmenu)\r\n      * [Parameters:](#parameters-2)\r\n    * [Method addMenu()](#method-addmenu)\r\n      * [Parameters:](#parameters-3)\r\n    * [Method addMenuItem()](#method-addmenuitem)\r\n      * [Parameters:](#parameters-4)\r\n    * [Method addMenuItems()](#method-addmenuitems)\r\n      * [Parameters:](#parameters-5)\r\n    * [Method addMenuService()](#method-addmenuservice)\r\n      * [Parameters:](#parameters-6)\r\n    * [Method evalMenu()](#method-evalmenu)\r\n      * [Parameters:](#parameters-7)\r\n    * [Method getErrorType()](#method-geterrortype)\r\n    * [Method getMemory()](#method-getmemory)\r\n    * [Method setVariable()](#method-setvariable)\r\n      * [Parameters:](#parameters-8)\r\n    * [Method getVariable()](#method-getvariable)\r\n      * [Parameters:](#parameters-9)\r\n    * [Method addVariableCallBack()](#method-addvariablecallback)\r\n      * [Parameters:](#parameters-10)\r\n    * [Method callVariablesCallBack()](#method-callvariablescallback)\r\n    * [Method hasColorSupport()](#method-hascolorsupport)\r\n    * [Method testArguments()](#method-testarguments)\r\n      * [Parameters:](#parameters-11)\r\n    * [Method testUserInput()](#method-testuserinput)\r\n      * [Parameters:](#parameters-12)\r\n    * [Method setMemory()](#method-setmemory)\r\n      * [Parameters:](#parameters-13)\r\n    * [Method setErrorType()](#method-seterrortype)\r\n      * [Parameters:](#parameters-14)\r\n    * [Method findVendorPath()](#method-findvendorpath)\r\n      * [Parameters:](#parameters-15)\r\n    * [Method createParam()](#method-createparam)\r\n      * [Parameters:](#parameters-16)\r\n    * [Method createOrReplaceParam()](#method-createorreplaceparam)\r\n    * [Method downLevel()](#method-downlevel)\r\n      * [Parameters:](#parameters-17)\r\n    * [Method evalParam()](#method-evalparam)\r\n      * [Parameters:](#parameters-18)\r\n    * [Method throwError()](#method-throwerror)\r\n      * [Parameters:](#parameters-19)\r\n    * [Method showWarning()](#method-showwarning)\r\n      * [Parameters:](#parameters-20)\r\n    * [Method addHistory()](#method-addhistory)\r\n      * [Parameters:](#parameters-21)\r\n    * [Method setHistory()](#method-sethistory)\r\n      * [Parameters:](#parameters-22)\r\n    * [Method clearHistory()](#method-clearhistory)\r\n    * [Method listHistory()](#method-listhistory)\r\n    * [Method getArrayParams()](#method-getarrayparams)\r\n      * [Parameters:](#parameters-23)\r\n    * [Method getColSize()](#method-getcolsize)\r\n    * [Method getParameter()](#method-getparameter)\r\n      * [Parameters:](#parameters-24)\r\n    * [Method getValue()](#method-getvalue)\r\n      * [Parameters:](#parameters-25)\r\n    * [Method readArgument()](#method-readargument)\r\n      * [Parameters:](#parameters-26)\r\n    * [Method showHelp()](#method-showhelp)\r\n      * [Parameters:](#parameters-27)\r\n    * [Method makeBigWords()](#method-makebigwords)\r\n      * [Parameters:](#parameters-28)\r\n    * [Method getValueKey()](#method-getvaluekey)\r\n      * [Parameters:](#parameters-29)\r\n    * [Method isCli()](#method-iscli)\r\n    * [Method getSTDIN()](#method-getstdin)\r\n    * [Method readData()](#method-readdata)\r\n      * [Parameters:](#parameters-30)\r\n    * [Method readDataPHPFormat()](#method-readdataphpformat)\r\n      * [Parameters:](#parameters-31)\r\n    * [Method isParameterPresent()](#method-isparameterpresent)\r\n      * [Parameters:](#parameters-32)\r\n    * [Method addExtensionFile()](#method-addextensionfile)\r\n      * [Parameters:](#parameters-33)\r\n    * [Method saveData()](#method-savedata)\r\n      * [Parameters:](#parameters-34)\r\n    * [Method saveDataPHPFormat()](#method-savedataphpformat)\r\n      * [Parameters:](#parameters-35)\r\n    * [Method setAlign()](#method-setalign)\r\n      * [Parameters:](#parameters-36)\r\n    * [Method setArrayParam()](#method-setarrayparam)\r\n      * [Parameters:](#parameters-37)\r\n    * [Method reconstructPath()](#method-reconstructpath)\r\n      * [Parameters:](#parameters-38)\r\n    * [Method getPhpOriginalFile()](#method-getphporiginalfile)\r\n    * [Method setPhpOriginalFile()](#method-setphporiginalfile)\r\n      * [Parameters:](#parameters-39)\r\n    * [Method setColor()](#method-setcolor)\r\n      * [Parameters:](#parameters-40)\r\n    * [Method setParam()](#method-setparam)\r\n      * [Parameters:](#parameters-41)\r\n    * [Method setParamUsingArray()](#method-setparamusingarray)\r\n      * [Parameters:](#parameters-42)\r\n    * [Method createContainer()](#method-createcontainer)\r\n      * [Parameters:](#parameters-43)\r\n    * [Method getValueAsArray()](#method-getvalueasarray)\r\n      * [Parameters:](#parameters-44)\r\n    * [Method setPatternTitle()](#method-setpatterntitle)\r\n      * [Parameters:](#parameters-45)\r\n    * [Method setPatternCurrent()](#method-setpatterncurrent)\r\n      * [Parameters:](#parameters-46)\r\n    * [Method setPatternSeparator()](#method-setpatternseparator)\r\n      * [Parameters:](#parameters-47)\r\n    * [Method setPatternContent()](#method-setpatterncontent)\r\n      * [Parameters:](#parameters-48)\r\n    * [Method setStyle()](#method-setstyle)\r\n      * [Parameters:](#parameters-49)\r\n    * [Method show()](#method-show)\r\n      * [Parameters:](#parameters-50)\r\n    * [Method showBread()](#method-showbread)\r\n      * [Parameters:](#parameters-51)\r\n    * [Method showCheck()](#method-showcheck)\r\n      * [Parameters:](#parameters-52)\r\n    * [Method showFrame()](#method-showframe)\r\n      * [Parameters:](#parameters-53)\r\n    * [Method showLine()](#method-showline)\r\n      * [Parameters:](#parameters-54)\r\n    * [Method clearScreen()](#method-clearscreen)\r\n    * [Method cursorHome()](#method-cursorhome)\r\n    * [Method cursorMove()](#method-cursormove)\r\n      * [Parameters:](#parameters-55)\r\n    * [Method bell()](#method-bell)\r\n    * [Method getCursorPosition()](#method-getcursorposition)\r\n    * [Method showMessageBox()](#method-showmessagebox)\r\n      * [Parameters:](#parameters-56)\r\n    * [Method alignLinesVertically()](#method-alignlinesvertically)\r\n      * [Parameters:](#parameters-57)\r\n    * [Method maxWidth()](#method-maxwidth)\r\n    * [Method showParamSyntax()](#method-showparamsyntax)\r\n      * [Parameters:](#parameters-58)\r\n    * [Method showParamSyntax2()](#method-showparamsyntax2)\r\n      * [Parameters:](#parameters-59)\r\n    * [Method setDefaultStream()](#method-setdefaultstream)\r\n      * [Parameters:](#parameters-60)\r\n    * [Method setNoColor()](#method-setnocolor)\r\n      * [Parameters:](#parameters-61)\r\n    * [Method isNoColor()](#method-isnocolor)\r\n    * [Method setNoANSI()](#method-setnoansi)\r\n      * [Parameters:](#parameters-62)\r\n    * [Method isNoANSI()](#method-isnoansi)\r\n    * [Method wrapLine()](#method-wrapline)\r\n      * [Parameters:](#parameters-63)\r\n    * [Method showProgressBar()](#method-showprogressbar)\r\n      * [Parameters:](#parameters-64)\r\n    * [Method getPageSize()](#method-getpagesize)\r\n    * [Method showTable()](#method-showtable)\r\n      * [Parameters:](#parameters-65)\r\n    * [Method showValuesColumn()](#method-showvaluescolumn)\r\n      * [Parameters:](#parameters-66)\r\n    * [Method showWaitCursor()](#method-showwaitcursor)\r\n      * [Parameters:](#parameters-67)\r\n    * [Method hideWaitCursor()](#method-hidewaitcursor)\r\n    * [Method hideCursor()](#method-hidecursor)\r\n    * [Method showCursor()](#method-showcursor)\r\n    * [Method showparams()](#method-showparams)\r\n    * [Method showParamValue()](#method-showparamvalue)\r\n      * [Parameters:](#parameters-68)\r\n    * [Method strlen()](#method-strlen)\r\n      * [Parameters:](#parameters-69)\r\n    * [Method removechar()](#method-removechar)\r\n      * [Parameters:](#parameters-70)\r\n    * [Method upLevel()](#method-uplevel)\r\n      * [Parameters:](#parameters-71)\r\n    * [Method getCh()](#method-getch)\r\n      * [Parameters:](#parameters-72)\r\n    * [Method colorText()](#method-colortext)\r\n      * [Parameters:](#parameters-73)\r\n    * [Method colorLess()](#method-colorless)\r\n      * [Parameters:](#parameters-74)\r\n    * [Method colorMask()](#method-colormask)\r\n      * [Parameters:](#parameters-75)\r\n    * [Method initialEndStyle()](#method-initialendstyle)\r\n      * [Parameters:](#parameters-76)\r\n    * [Method replaceCurlyVariable()](#method-replacecurlyvariable)\r\n      * [Parameters:](#parameters-77)\r\n  * [menu](#menu)\r\n    * [addMenu()](#addmenu)\r\n    * [addMenuItem()](#addmenuitem)\r\n    * [addMenuItems()](#addmenuitems)\r\n    * [evalMenu()](#evalmenu)\r\n    * [clearMenu()](#clearmenu)\r\n    * [example](#example)\r\n  * [Examples](#examples)\r\n    * [Example using arguments](#example-using-arguments)\r\n    * [Example using user input](#example-using-user-input)\r\n    * [Example with a game](#example-with-a-game)\r\n    * [Example colors](#example-colors)\r\n    * [Example tables](#example-tables)\r\n  * [Types of user input](#types-of-user-input)\r\n  * [Types of colors](#types-of-colors)\r\n  * [Definitions](#definitions)\r\n  * [debug](#debug)\r\n  * [Compatibility](#compatibility)\r\n  * [Changelog](#changelog)\r\n\u003c!-- TOC --\u003e\r\n\r\n## Flow\r\n\r\n* (optional) you can set the current value using the method setParam()\r\n* If the type of parameter is not \"onlyinput\" and \"none\", then it reads the parameter\r\n    * Example: php program.php -param1 value --param2 -param3=\"hello world\" parampositional\r\n* If the parameter is found, then it is returned, **end of the flow**.\r\n* If the parameter is not found then\r\n    * If setCurrentAsDefault() is set, and the current value is not null, then the default value is the current value.\r\n    * Otherwise, the default value is the value set using the method setDefault(). If none, then it uses null.\r\n* if input is true setInput(true) then it asks to user-input the value\r\n    * if the user doesn't fill the information, then it returns the default value (if any), **end of the flow**\r\n    * if the user fills the information, but it is incorrect, then it asks again and again.\r\n    * if the user fills the right information, then it returns this value, **end of the flow**\r\n* if input is true setInput(false) then\r\n    * Note: we were unable to read the values of the argument, and we don't want to read from user input.\r\n    * it returns the default value, and it could raise an error, **end of the flow**\r\n\r\nNote:\r\n\r\n* isRequired() if the value is missing, then it shows an error.\r\n* setAllowEmpty() if the value is empty (not missing), then it allows to enter an empty value\r\n\r\n## Input as arguments\r\n\r\n```shell\r\nphp mycli.php subcommandfirst subcommandsecond -flag valueflag --longflag valueflag2 subcommandlatest\r\n```\r\n\r\nThe system allows reading multiple types of arguments\r\n\r\n* **first**: this argument does not have value, and it is position (in the very first position),\r\n  it must be not be prefixed with a \"-\", otherwise it would be considered a flag instead of a positional argument.\r\n\r\n```shell\r\ncliprogram.php first # the value obtained is \"first\".\r\n```\r\n\r\n* **command**: it is similar to **first,** but it does not compare the name of the argument.\r\n\r\n```shell\r\ncliprogram.php com -flag # first returns \"com\" if the argument is named first.  command returns \"com\" regardless of its name.\r\n```\r\n\r\n* **second**: this argument is also positional (second position) and does not have any value\r\n\r\n```shell\r\ncliprogram.php first second -someflag # the value obtained is \"second\"\r\n```\r\n\r\n* **last**: this argument is also positional, and it is always at the latest argument\r\n\r\n```shell\r\ncliprogram.php first second  last # the value obtained is \"last\"\r\n```\r\n\r\n* **flag**: the argument is prefixed with a single \"-\". This argument not need to be a single character.\r\n\r\n```shell\r\ncliprogram.php -flag hello # the value of the flag called \"flag\" is \"hello\"\r\n```\r\n\r\n* **longflag**: the argument is prefixed with a double \"--\"\r\n\r\n```shell\r\ncliprogram.php --flag hello # the value of the doubleflag called \"flag\" is \"hello\"\r\n```\r\n\r\n* **onlyinput/none**: the system never read it as argument, so it could be user-input.\r\n    * none means that the argument is only user-input, and it must not be stored.\r\n\r\n```shell\r\ncliprogram.php  # \"onlyinput/none\" could not be obtained via command line\r\n```\r\n\r\nThe argument could be created as:\r\n\r\n```php\r\n// program.php -f hello\r\n// or\r\n// program.php -f=hello\r\n// or\r\n// program.php -f \"hello world\"\r\n$cli-\u003ecreateParam('f','flag')-\u003eadd();  // add() is important otherwise the parameter will not be create.\r\n```\r\n\r\nAnd it could be read as:\r\n\r\n```php\r\n$result=$cli-\u003eevalParam('name'); // $result-\u003evalue will return \"hello\"\r\n```\r\n\r\nNow, what if you want to create multiples alias for the same parameter.\r\n\r\n```php\r\n// program.php -h \r\n// or\r\n// program.php --help \r\n$cli-\u003ecreateParam('h','flag',['help'])-\u003eadd();  // it adds an alias longflag called \"help\"\r\n```\r\n\r\n## Input interactive\r\n\r\nThere are several configuration to set an input interactively.\r\n\r\nBy default, every parameter is read as argument. If the value is read as argument, then it is not asked interactively.\r\n\r\nHowever, if the parameter is of the type \"**none**\" or \"**onlyinput**\", then they are only obtained by user input (\r\ninteractively).\r\n\r\nExample:\r\n\r\n```php\r\n$cli-\u003e$t-\u003ecreateParam('paramname',[],'none');\r\n```\r\n\r\n### User input (interactive)\r\n\r\nWith the method setInput() we set that this parameter could also be read interactively.\r\n\r\n```php\r\n$cli-\u003e$t-\u003ecreateParam('paramname',[],'none')-\u003esetInput();\r\n```\r\n\r\nExample, let's say the next example:\r\n\r\n```php\r\n$cli=new CliOne();\r\n$cli-\u003ecreateParam('p1',[],'none')\r\n    -\u003esetInput()\r\n    -\u003eadd(); // we create the param\r\n$cli-\u003eevalParam('p1'); // and we evaluated the parameter\r\n```\r\n\r\n![](docs/basic1.jpg)\r\n\r\nNow, this input accepts any kind of text. But there is many kind of user input.\r\n\r\n| type        | description                                                           | argument                            | example                                                        |\r\n|-------------|-----------------------------------------------------------------------|-------------------------------------|----------------------------------------------------------------|\r\n| number      | It allows any kind of number                                          |                                     | setInput(true,\"number\")                                        |\r\n| range       | it only allow number between a range of values                        | [1,20]                              | setInput(true,\"range\",[1,10])                                  |\r\n| string      | It allows any type of value                                           | (used for auto complete)            | setInput(true,\"string\")                                        |\r\n| password    | It allows any type of value but the  default value is never displayed | setInput(true,\"password\")           |                                                                |\r\n| multiple    | it allows to check one or multiple values using 1 column              | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"multiple\",['key1'=\u003e'value1','key2'=\u003e'value2'])  |\r\n| multiple2   | it allows to check one or multiple values using 2 columns             | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"multiple2\",['key1'=\u003e'value1','key2'=\u003e'value2']) |\r\n| multiple3   | it allows to check one or multiple values using 3 columns             | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"multiple3\",['key1'=\u003e'value1','key2'=\u003e'value2']) |\r\n| multiple4   | it allows to check one or multiple values using 4 columns             | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"multiple4\",['key1'=\u003e'value1','key2'=\u003e'value2']) |\r\n| option      | it allows to select a value from a list using 1 column                | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"option\",['key1'=\u003e'value1','key2'=\u003e'value2'])    |\r\n| option2     | it allows to select a value from a list using 2 columns               | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"option2\",['key1'=\u003e'value1','key2'=\u003e'value2'])   |\r\n| option3     | it allows to select a value from a list using 3 columns               | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"option3\",['key1'=\u003e'value1','key2'=\u003e'value2'])   |\r\n| option4     | it allows to select a value from a list using 4 columns               | ['key1'=\u003e'value1','key2'=\u003e'value2'] | setInput(true,\"option4\",['key1'=\u003e'value1','key2'=\u003e'value2'])   |\r\n| optionshort | It allows a selection of values                                       | [\"yes\",\"no\"]                        | setInput(true,\"multiple4\",['key1'=\u003e'value1','key2'=\u003e'value2']) |\r\n\r\nOption returns a value and a value-key. Value is the content visible. And value-key, is the content selected by the\r\nuser.\r\n\r\n**Example Option:**\r\n\r\n```php\r\n$cli=new CliOne();\r\n$cli-\u003ecreateParam('p1',[],'none')\r\n    -\u003esetInput(true,'option2',['key1'=\u003e'value1','key2'=\u003e'value2','key3'=\u003e'value3','key4'=\u003e'value4'])\r\n    -\u003eadd(); // we create the param\r\n$cli-\u003eevalParam('p1');\r\n$cli-\u003eshowLine(\"value :\".$cli-\u003egetValue('p1'));\r\n$cli-\u003eshowLine(\"valuekey :\".$cli-\u003egetValueKey('p1'));\r\n```\r\n\r\n![](docs/basic2.jpg)\r\n\r\n**Example Multiple:**\r\n\r\n```php\r\n$cli=new CliOne();\r\n$cli-\u003ecreateParam('p1',[],'none')\r\n    -\u003esetInput(true,'option2',['key1'=\u003e'value1','key2'=\u003e'value2','key3'=\u003e'value3','key4'=\u003e'value4'])\r\n    -\u003eadd(); \r\n$cli-\u003eevalParam('p1'); // value returns an associative array with the values selected, example: [\"value1\",\"value3\"]\r\n```\r\n\r\n![](docs/basic3.jpg)\r\n\r\n### Customize user input\r\n\r\nIt is possible to customize the input by changing the help description, changing the question, showing an example or\r\nshowing a value to the argument\r\n\r\n```php\r\n$cli=new CliOne();\r\n$cli-\u003ecreateParam('p1',[],'none')\r\n    -\u003esetInput()\r\n    -\u003esetDescription('it is for help','what is the value of p1?',['help line1','help line 2'],'the argument is called p1')\r\n    -\u003eadd(); \r\n$cli-\u003eevalParam('p1'); \r\n```\r\n\r\n\r\n\r\n\r\n\r\n## CliOne Class\r\nCliOne - A simple creator of command-line argument program.\r\n\r\n### Method __construct()\r\n\r\nThe constructor. If there is an instance, then it replaces the instance.\r\n\r\n#### Parameters:\r\n\r\n* **$origin** you can specify the origin script file. If you specify the origin script\r\n  then, isCli will only return true if the file is called directly using its file. (string|null)\r\n* **$ignoreCli** if true, then it will run no matter if it is running on cli or not. (bool)\r\n\r\n### Method getWindowsVersion()\r\n\r\nIt returns the current Windows version as a decimal number.\u003cbr\u003e\r\nIf no version is found then it returns 6.1 (Windows 7).\u003cbr\u003e\r\nWindows 10 and Windows 11 versions are returned as 10.xxxx instead of 10.0.xxxx\r\n\r\n### Method instance()\r\n\r\nIt gets the current instance of the library.\u003cbr/\u003e\r\nIf the instance does not exist, then it is created\r\n\r\n#### Parameters:\r\n\r\n* **$origin** you can specify the origin script file. If you specify the origin script\r\n  then, isCli will only return true if the file is called directly using its file. (string|null)\r\n\r\n### Method hasInstance()\r\n\r\nReturns true if there is an instance of CliOne.\r\n\r\n### Method hasMenu()\r\n\r\nIt returns true if CliOne has a menu defined. It will return false if there is no menu or there is no instance.\r\n\r\n### Method clearMenu()\r\n\r\nIt clears a menu and the services associated.\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** If null, then it clears all menus (string|null)\r\n\r\n### Method addMenu()\r\n\r\nIt adds a new menu that could be called by evalMenu()\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n//\"fnheader\" call to $this-\u003emenuHeader(CliOne $cli);\r\n$this-\u003eaddMenu('idmenu','fnheader',null,'What do you want to do?','option3');\r\n// you can use a callable argument, the first argument is of type CliOne.\r\n$this-\u003eaddMenu('idmenu',function($cli) { echo \"header\";},function($cli) { echo \"footer;\"});\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** The unique name of the menu (string)\r\n* **$headerFunction** Optional, the name of the method called every time the menu is\r\n  displayed\u003cbr/\u003e\r\n  The method called must have a prefix menu.Ex:\"opt1\",method:menuopt1\"\r\n  If $headerFunction is callable, then it calls the function. (string|null|callable)\r\n* **$footerFunction** Optional, the name of the method called every time the menu end its\r\n  display. The method called must have a prefix \"menu\".\u003cbr/\u003e\r\n  If $footerFunction is callable, then it calls the function (string|null|callable)\r\n* **$question** The input question. (string)\r\n* **$size** =['option','option2','option3','option4','wide-option','wide-option2'][$i]\r\n  The size of the option menu. (string)\r\n\r\n### Method addMenuItem()\r\n\r\nIt adds a menu item.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003eaddMenu('menu1');\r\n// if op1 is selected then it calls method menufnop1(), the prefix is for protection.\r\n$this-\u003eaddMenuItem('menu1','op1','option #1','fnop1');\r\n// if op1 is selected then it calls method menuop2()\r\n$this-\u003eaddMenuItem('menu1','op2','option #2');\r\n$this-\u003eaddMenuItem('menu1','op3','go to menu2','navigate:menu2');\r\n$this-\u003eaddMenuItem('menu1','op4','call function',function(CliOne $cli) {  });\r\n$this-\u003eevalMenu('menu1',$obj);\r\n// the method inside $obj\r\npublic function menufnop1($caller):void {\r\n}\r\npublic function menuop2($caller):string {\r\nreturn 'EXIT'; // if any function returns EXIT (uppercase), then the menu ends (simmilar to \"empty to\r\nexit\")\r\n}\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** The unique name of the menu (string)\r\n* **$indexMenuItem** The unique index of the menu. It is used for selection and action\r\n  (if no action is supplied). (string)\r\n* **$description** The description of the menu (string)\r\n* **$action** The action is the method called (the method must have a prefix\r\n  \"menu\").\u003cbr/\u003e If action starts with \u003cb\u003e\"navigate:\"\u003c/b\u003e then it opens\r\n  the menu indicated.\u003cbr/\u003e If action is \"exit:\" then exit of the\r\n  menu.\u003cbr/\u003e If action is callable, then it calls the function (string|null|callable)\r\n\r\n### Method addMenuItems()\r\n\r\nIt adds multiples items to a menu\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003eaddMenu('menu1');\r\n$this-\u003eaddMenuItems('menu1',[\r\n'op1'=\u003e['operation #1','action1'], // with description \u0026 action\r\n'op2'=\u003e'operation #2']); // the action is \"op2\"\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** The unique name of the menu (string)\r\n* **$items** An associative array with the items to add. Examples:\u003cbr/\u003e\r\n  [index=\u003e[description,action]]\u003cbr/\u003e\r\n  [index=\u003edescription]\u003cbr/\u003e (array|null)\r\n\r\n### Method addMenuService()\r\n\r\nIt adds a service object to be evaluated when we run evalMenu()\u003cbr/\u003e\r\nYou can add menu services. Every service is evaluated in order, so if both service objects has the same method,\r\nthen it is only called by the first object.\u003cbr/\u003e\r\nIf evalMenu() uses a service then, the services defined here are ignored.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$objService=new Class1();\r\n$this-\u003eaddMenuService('menu1',$objService);\r\n// or:\r\n$this-\u003eaddMenuService('menu1',Class1:class);\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** The unique name of the menu (string)\r\n* **$service** The service object or the name of the class.\u003cbr/\u003e\r\n  If it is a name of a class, then it creates an instance of it. (object|string)\r\n\r\n### Method evalMenu()\r\n\r\nEval (executes) a menu previously defined.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003eaddMenu('menu1');\r\n// pending: add items to the menu\r\n$this-\u003eevalMenu('menu1',$myService);\r\n// or also\r\n$this-\u003e\u003eaddMenu('menu1')-\u003eaddMenuService('menu1',$myService)-\u003eevalMenu('menu1');\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$idMenu** The unique name of the menu (string)\r\n* **$caller** The caller object(s). It is used to the events and actions.\u003cbr/\u003e\r\n  If null, then it use the services defined by addMenuService();\u003cbr/\u003e\r\n  If it is an array, then it calls the first object that has the method\u003cbr/\u003e\r\n  If this argument is used then addMenuService() is ignored (object|null|array)\r\n\r\n### Method getErrorType()\r\n\r\n### Method getMemory()\r\n\r\n### Method setVariable()\r\n\r\nIt sets a value into an array.\u003cbr/\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$variableName** the name of the variable. If the variable exists, then it is replaced. (string)\r\n* **$value** the value to assign. (mixed)\r\n* **$callBack** if the value is true (default), then every modification (if the value is changed)\r\n  will call the functions defined in addVariableCallBack()\u003cbr/\u003e if fallse, then it does\r\n  not call the callback functions. (bool)\r\n\r\n### Method getVariable()\r\n\r\nIt gets the value of a variable\r\n\r\n#### Parameters:\r\n\r\n* **$variableName** The name of the variable (string)\r\n* **$valueIfNotFound** If not found then it returns this value (mixed|null)\r\n\r\n### Method addVariableCallBack()\r\n\r\nIt adds a callback function.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$t-\u003eaddVariableCallBack('call1', function(CliOne $cli) {\r\n$cli-\u003esetVariable('v2', 'world',false); // the false is important if you don't want recursivity\r\n});\r\n```\r\n\r\nThis function is called every setVariable() if the value is different as the defined.\r\n\r\n#### Parameters:\r\n\r\n* **$callbackName** the name of the function. If the function exists, then it is replaced. (string)\r\n* **$function** If the function is null, then it deleted the function assigned.\u003cbr/\u003e\r\n  The function could be defined using an argument of the type CliOne. (callable|null)\r\n\r\n### Method callVariablesCallBack()\r\n\r\nIt calls the callback functions. Usually they are called every time we setVariable() (and the value is changed).\r\n\r\n### Method hasColorSupport()\r\n\r\nThis function is based in Symfony\r\n\r\n### Method testArguments()\r\n\r\nIt is used for testing. You can simulate arguments using this function\u003cbr/\u003e\r\nThis function must be called before the creation of the instance\r\n\r\n#### Parameters:\r\n\r\n* **$arguments** param array $arguments (array)\r\n\r\n### Method testUserInput()\r\n\r\nIt is used for testing. You can simulate user-input using this function\u003cbr/\u003e\r\nThis function must be called before every interactivity\u003cbr/\u003e\r\nThis function is not resetted automatically, to reset it, set $userInput=null\u003cbr/\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$userInput** param ?array $userInput (?array)\r\n* **$throwNoInput** (def:true) if true then it throws an exception if not input\u003cbr\u003e\r\n  if false, then if no more input then it cleans the userinput (bool)\r\n\r\n### Method setMemory()\r\n\r\nIt sets the value stored into the memory stream\u003cbr/\u003e\r\nIf the memory stream has values, then they are deleted and replaced.\r\n\r\n#### Parameters:\r\n\r\n* **$memory** The value to store (string)\r\n\r\n### Method setErrorType()\r\n\r\nIt sets if you want to display errors or not. This flag is reseted every time it is used.\r\n\r\n#### Parameters:\r\n\r\n* **$errorType** =['silent','show','throw'][$i] (default is show) (string)\r\n\r\n### Method findVendorPath()\r\n\r\nIt finds the vendor path starting from a route. The route must be inside the application path.\r\n\r\n#### Parameters:\r\n\r\n* **$initPath** the initial path, example __DIR__, getcwd(), 'folder1/folder2'. If null, then\r\n  __DIR__ (?string)\r\n\r\n### Method createParam()\r\n\r\nIt creates a new parameter to be read from the command line and/or to be input manually by the user\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003ecreateParam('k1','first'); // php program.php thissubcommand\r\n$this-\u003ecreateParam('k1','flag',['flag2','flag3']); // php program.php -k1 \u003cval\u003e or --flag2 \u003cval\u003e or --flag3\r\n\u003cval\u003e\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$key** The key or the parameter. It must be unique. (string)\r\n* **$alias** A simple array with the name of the arguments to read without \"-\" or\r\n  \u003cb\u003eflag\u003c/b\u003e: (default) it reads a flag \"php program.php -thisflag\r\n  value\"\u003cbr/\u003e\r\n  \u003cb\u003efirst\u003c/b\u003e: it reads the first argument \"php program.php thisarg\"\r\n  (without value)\u003cbr/\u003e\r\n  \u003cb\u003esecond\u003c/b\u003e: it reads the second argument \"php program.php sc1\r\n  thisarg\" (without value)\u003cbr/\u003e\r\n  \u003cb\u003elast\u003c/b\u003e: it reads the second argument \"php program.php ... thisarg\"\r\n  (without value)\u003cbr/\u003e\r\n  \u003cb\u003elongflag\u003c/b\u003e: it reads a longflag \"php program --thislongflag\r\n  value\u003cbr/\u003e\r\n  \u003cb\u003elast\u003c/b\u003e: it reads the second argument \"php program.php ...\r\n  thisvalue\" (without value)\u003cbr/\u003e\r\n  \u003cb\u003eonlyinput\u003c/b\u003e: the value means to be user-input, and it is\r\n  stored\u003cbr/\u003e\r\n  \u003cb\u003enone\u003c/b\u003e: the value it is not captured via argument, so it could be\r\n  user-input, but it is not stored\u003cbr/\u003e none parameters could always be\r\n  overridden, and they are used to \"temporary\" input such as validations\r\n  (y/n). (array|string)\r\n* **$type** =['command','first','last','second','flag','longflag','onlyinput','none'][$i]\u003cbr/\u003e\r\n  \"-\"\u003cbr/\u003e if the type is a flag, then the alias is a double flag\r\n  \"--\".\u003cbr/\u003e if the type is a double flag, then the alias is a flag. (string)\r\n* **$argumentIsValueKey** \u003cb\u003etrue\u003c/b\u003e the argument is value-key\u003cbr/\u003e\r\n  \u003cb\u003efalse\u003c/b\u003e (default) the argument is a value (bool)\r\n\r\n### Method createOrReplaceParam()\r\n\r\n### Method downLevel()\r\n\r\nDown a level in the breadcrub.\u003cbr/\u003e\r\nIf down more than the number of levels available, then it clears the stack.\r\n\r\n#### Parameters:\r\n\r\n* **$number** number of levels to down. (int)\r\n\r\n### Method evalParam()\r\n\r\nIt evaluates the parameters obtained from the syntax of the command.\u003cbr/\u003e\r\nThe parameters must be defined before call this method\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n// shell:\r\nphp mycode.php -argument1 hello -argument2 world\r\n// php code:\r\n$t=new CliOne('mycode.php');\r\n$t-\u003ecreateParam('argument1')-\u003eadd();\r\n$result=$t-\u003eevalParam('argument1'); // an object ClieOneParam where value is \"hello\"\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key to read.\u003cbr/\u003e\r\n  If $key='*' then it reads the first flag and returns its value (if any). (string)\r\n* **$forceInput** it forces input no matter if the value is already inserted. (bool)\r\n* **$returnValue** If true, then it returns the value obtained.\u003cbr/\u003e\r\n  If false (default value), it returns an instance of CliOneParam. (bool)\r\n\r\n### Method throwError()\r\n\r\nIt throws an error. Depending on the type, it could show an error or throw a runtime exception.\r\n\r\n#### Parameters:\r\n\r\n* **$msg** param string $msg (string)\r\n\r\n### Method showWarning()\r\n\r\nIt shows a warning\r\n\r\n#### Parameters:\r\n\r\n* **$msg** param array|string $msg (array|string)\r\n\r\n### Method addHistory()\r\n\r\nAdd a value to the history\r\n\r\n#### Parameters:\r\n\r\n* **$prompt** the value(s) of the history to add (string|array)\r\n\r\n### Method setHistory()\r\n\r\nIt sets the history (deleting the old history) with the new values\r\n\r\n#### Parameters:\r\n\r\n* **$prompt** param string|array $prompt (string|array)\r\n\r\n### Method clearHistory()\r\n\r\nIt clears the global history (if any).\r\n\r\n### Method listHistory()\r\n\r\nIt retrieves the global history (if any)\r\n\r\n### Method getArrayParams()\r\n\r\nIt returns an associative array with all the parameters of the form [key=\u003evalue]\u003cbr/\u003e\r\nParameters of the type \"none\" are ignored\u003cbr/\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$excludeKeys** you can add a key that you want to exclude. (array)\r\n\r\n### Method getColSize()\r\n\r\nIt returns the number of columns present on the screen. The columns are calculated in the constructor.\r\n\r\n### Method getParameter()\r\n\r\nIt gets the parameter by the key or an empty parameter with a null key if null.\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key of the parameter (string)\r\n\r\n### Method getValue()\r\n\r\nIt reads a value of a parameter.\r\n**Example:**\u003cbt\u003e\r\n\r\n```\r\n// [1] option1\r\n// [2] option2\r\n// select a value [] 2\r\n$v=$this-\u003egetValueKey('idparam'); // it will return \"option2\".\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key of the parameter to read the value (string)\r\n\r\n### Method readArgument()\r\n\r\nIt reads a parameter as an argument or flag.\r\n\r\n#### Parameters:\r\n\r\n* **$parameter** param CliOneParam $parameter (CliOneParam)\r\n\r\n### Method showHelp()\r\n\r\nIt shows the help\r\n\r\n#### Parameters:\r\n\r\n* **$parameter** param CliOneParam $parameter (CliOneParam)\r\n* **$verbose** param bool $verbose (bool)\r\n\r\n### Method makeBigWords()\r\n\r\n#### Parameters:\r\n\r\n* **$word** the words to display. (string)\r\n* **$font** =['atr','znaki'][$i] (string)\r\n* **$trim** if true then, if the first line and/or the last line is empty, then it is removed. (bool)\r\n* **$bit1** the visible character, if null then it will use a block code (?string)\r\n* **$bit0** the invisible character (string)\r\n\r\n### Method getValueKey()\r\n\r\nIt reads the value-key of a parameter selected. It is useful for a list of elements.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n// [1] option1\r\n// [2] option2\r\n// select a value [] 2\r\n$v=$this-\u003egetValueKey('idparam'); // it will return 2 instead of \"option2\"\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key of the parameter to read the value-key (string)\r\n\r\n### Method isCli()\r\n\r\nIt will return true if the PHP is running on CLI\u003cbr/\u003e\r\nIf the constructor specified a file, then it is also used for validation.\r\n**Example:**\r\n\r\n```\r\n// page.php:\r\n$inst=new CliOne('page.php'); // this security avoid calling the cli when this file is called by others.\r\nif($inst-\u003eisCli()) {\r\necho \"Is CLI and the current page is page.php\";\r\n}\r\n```\r\n\r\n### Method getSTDIN()\r\n\r\nIt gets the STDIN exclusively if the value is passed by pipes. If not, it returns null;\r\n\r\n### Method readData()\r\n\r\nIt reads information from a file. The information will be de-serialized.\r\n\r\n#### Parameters:\r\n\r\n* **$filename** the filename with or without extension. (string)\r\n* **$defaultExtension** the default extension. (string)\r\n\r\n### Method readDataPHPFormat()\r\n\r\nIt reads information from a file. The information is evaluated, so the file must be safe.\u003cbr/\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$filename** the filename with or without extension. (string)\r\n* **$defaultExtension** the default extension. (string)\r\n\r\n### Method isParameterPresent()\r\n\r\nReturns true if the parameter is present with or without data.\u003cbr/\u003e\r\nThe parameter is not changed, neither the default values nor user input are applied\u003cbr/\u003e\r\nReturned Values:\u003cbr/\u003e\r\n\r\n\u003cul\u003e\r\n\u003cli\u003e\u003cb\u003enone\u003c/b\u003e the value is not present, ex: \u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eempty\u003c/b\u003e the value is present but is empty, ex: -arg1\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003evalue\u003c/b\u003e the value is present, and it has a value, ex: -arg1 value\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$key** param string $key (string)\r\n\r\n### Method addExtensionFile()\r\n\r\nUtil class. It adds a default extension to a filename only if the filename doesn't have extension.\r\n\r\n#### Parameters:\r\n\r\n* **$filename** The filename full or partial, example \"file.jpg\", \"file\", \"/folder/file\" (string)\r\n* **$extension** The extension to add including the dot, example \".ext\".\u003cbr/\u003e\r\n  The default value is \".config.php\" (string)\r\n\r\n### Method saveData()\r\n\r\nIt saves the information into a file. The content will be serialized.\r\n\r\n#### Parameters:\r\n\r\n* **$filename** the filename (without extension) to where the value will be saved. (string)\r\n* **$content** The content to save. It will be serialized. (mixed)\r\n* **$defaultExtension** The default extension. (string)\r\n\r\n### Method saveDataPHPFormat()\r\n\r\nIt saves the information into a file. The content will be converted into a PHP file.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003esaveDataPHPFormat('file',[1,2,3]); // it will save a file with the next content: $config=[1,2,3];\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$filename** the filename (without extension) to where the value will be saved. (string)\r\n* **$content** The content to save. It will be serialized. (mixed)\r\n* **$defaultExtension** The default extension. (string)\r\n* **$namevar** The name of the variable, excample: config or $config (string)\r\n\r\n### Method setAlign()\r\n\r\nIt sets the alignment.  This method is stackable.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n$cli-\u003esetAlign('left','left','right')-\u003esetStyle('double')-\u003eshowTable($values);\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$title** =['left','right','middle'][$i] the alignment of the title (string)\r\n* **$content** =['left','right','middle'][$i] the alignment of the content (string)\r\n* **$contentNumeric** =['left','right','middle'][$i] the alignment of the content (numeric) (string)\r\n\r\n### Method setArrayParam()\r\n\r\nIt sets the parameters using an array of the form [key=\u003evalue]\u003cbr/\u003e\r\nIt also marks the parameters as missing=false\r\n\r\n#### Parameters:\r\n\r\n* **$array** the associative array to use to set the parameters. (array)\r\n* **$excludeKeys** you can add a key that you want to exclude.\u003cbr/\u003e\r\n  If the key is in the array and in this list, then it is excluded (array)\r\n* **$includeKeys** the whitelist of elements that only could be included.\u003cbr/\u003e\r\n  Only keys that are in this list are added. (array|null)\r\n\r\n### Method reconstructPath()\r\n\r\nIt is used internally to reconstruct the path of the current script.\r\n\r\n#### Parameters:\r\n\r\n* **$includePHP** param bool $includePHP (bool)\r\n* **$trimArguments** param int $trimArguments (int)\r\n\r\n### Method getPhpOriginalFile()\r\n\r\nIt gets the php original file\r\n\r\n### Method setPhpOriginalFile()\r\n\r\nIt sets the php original file\r\n\r\n#### Parameters:\r\n\r\n* **$phpOriginalFile** param string $phpOriginalFile (string)\r\n\r\n### Method setColor()\r\n\r\nIt sets the color in the stack\r\n\r\n#### Parameters:\r\n\r\n* **$colors** =['red','yellow','green','white','blue','black',cyan','magenta'][$i] (array)\r\n\r\n### Method setParam()\r\n\r\nIt sets the value or value-key of a parameter manually.\u003cbr/\u003e\r\nIt also marks the origin of the argument as \"set\" and it markes the argument as missing=false\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key of the parameter (string)\r\n* **$value** the value (or the value-key) to assign. (mixed)\r\n* **$isValueKey** if \u003cb\u003efalse\u003c/b\u003e (default) then the argument $value is the value of the\r\n  parameter\u003cbr/\u003e if \u003cb\u003etrue\u003c/b\u003e then the argument $value is the value-key. (bool)\r\n* **$createIfNotExist** If true and the parameter doesn't exist, then it is created with the default\r\n  configuration. (bool)\r\n\r\n### Method setParamUsingArray()\r\n\r\nSet the values of the parameters using an array.\u003cbr/\u003e\r\nIf the parameter does not exist, then it is created with the default values\r\n\r\n#### Parameters:\r\n\r\n* **$assocArray** An associative array of the form ['key'=\u003e'value'] (array|null)\r\n* **$fields** if null, then is set all values of the array\u003cbr/\u003e\r\n  If not null, then it is used to determine which fields will be used (array|null)\r\n\r\n### Method createContainer()\r\n\r\nUSE FUTURE. It creates a container.\r\n\r\n#### Parameters:\r\n\r\n* **$width** param $width ()\r\n* **$height** param $height ()\r\n\r\n### Method getValueAsArray()\r\n\r\nIt gets the values of the parameters are an associative array.\r\n\r\n#### Parameters:\r\n\r\n* **$fields** If the fields are null then it returns all parameters, including \"none\". (array|null)\r\n* **$asAssocArray** (def:true) if true then it returns the values as an associative array\u003cbr\u003e\r\n  if false, then it returns as an indexed array. (bool)\r\n\r\n### Method setPatternTitle()\r\n\r\nIt sets the pattern used for the title. This operation is used in a stack.\r\n{value} {type}\r\n\r\n#### Parameters:\r\n\r\n* **$pattern1Stack** if null then it will use the default value. (?string)\r\n\r\n### Method setPatternCurrent()\r\n\r\n\u003cbold\u003e{value}{type}\u003c/bold\u003e\r\n\r\n#### Parameters:\r\n\r\n* **$pattern2Stack** if null then it will use the default value. (?string)\r\n\r\n### Method setPatternSeparator()\r\n\r\n\"\u003e\"\r\n\r\n#### Parameters:\r\n\r\n* **$pattern3Stack** if null then it will use the default value. (?string)\r\n\r\n### Method setPatternContent()\r\n\r\nNot used yet.\r\n\r\n#### Parameters:\r\n\r\n* **$pattern4Stack** if null then it will use the default value. (?string)\r\n\r\n### Method setStyle()\r\n\r\nIt sets the styles used by different elements\r\n\r\n#### Parameters:\r\n\r\n* **$style** =['mysql','simple','double','minimal','style'][$i] (string)\r\n* **$waitingIconStyle** =['triangle','braille','pipe','braille2','bar','bar2','bar3','arc','waiting'][$i]\r\n  \u003cbr\u003eif is an array, then it uses the elements of array to show the waiting\r\n  icon (string|array)\r\n\r\n### Method show()\r\n\r\nIt's similar to showLine, but it keeps in the current line.\r\n\r\n#### Parameters:\r\n\r\n* **$content** param string $content (string)\r\n* **$stream** =['stdout','stderr','memory'][$i] (?string)\r\n\r\n### Method showBread()\r\n\r\nIt shows a breadcrumb.\u003cbr/\u003e\r\nTo add values you could use the method uplevel()\u003cbr/\u003e\r\nTo remove a value (going down a level) you could use the method downlevel()\u003cbr/\u003e\r\nYou can also change the style using setPattern1(),setPattern2(),setPattern3()\u003cbr/\u003e\r\n\r\n```\r\n$cli-\u003esetPattern1('{value}{type}') // the level\r\n-\u003esetPattern2('\u003cbred\u003e{value}\u003c/bred\u003e{type}') // the current level\r\n-\u003esetPattern3(' -\u003e ') // the separator\r\n-\u003eshowBread();\r\n```\r\n\r\nIt shows the current BreadCrumb if any.\r\n\r\n#### Parameters:\r\n\r\n* **$showIfEmpty** if true then it shows the breadcrumb even if it is empty (empty line)\u003cbr/\u003e\r\n  if false (default) then it doesn't show the breadcrumb if it is empty. (bool)\r\n\r\n### Method showCheck()\r\n\r\nIt shows a label messages in a single line, example: \u003ccolor\u003e[ERROR]\u003c/color\u003e Error message\r\n\r\n#### Parameters:\r\n\r\n* **$label** param string|array $label (string|array)\r\n* **$color** =['red','yellow','green','white','blue','black',cyan','magenta'][$i] (string)\r\n* **$content** param string|array $content (string|array)\r\n* **$stream** =['stdout','stderr','memory'][$i] (string)\r\n\r\n### Method showFrame()\r\n\r\nIt shows a border frame.\r\n\r\n#### Parameters:\r\n\r\n* **$lines** the content. (string|string[])\r\n* **$titles** if null then no title. (string|string[]|null)\r\n\r\n### Method showLine()\r\n\r\nIt shows (echo) a colored line. The syntax of the color is similar to html as follows:\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\n\u003cred\u003eerror\u003c/red\u003e; (color red)\r\n\u003cyellow\u003ewarning\u003c/yellow\u003e (color yellow)\r\n\u003cblue\u003einformation\u003c/blue\u003e (blue)\r\n\u003cyellow\u003eyellow\u003c/yellow\u003e (yellow)\r\n\u003cgreen\u003egreen\u003c/green\u003e  (color green)\r\n\u003citalic\u003eitalic\u003c/italic\u003e\r\n\u003cbold\u003ebold\u003c/bold\u003e\r\n\u003cbred\u003eerror\u003c/bred\u003e; (color background red, it also works for the other colors \u003cb*\u003e)\r\n\u003cdim\u003edim\u003c/dim\u003e\r\n\u003cinvisible\u003einvisible\u003c/invisible\u003e (it could not work in some terminals)\r\n\u003cunderline\u003eunderline\u003c/underline\u003e\r\n\u003cstrikethrough\u003estrikethrough\u003c/strikethrough\u003e\r\n\u003ccyan\u003ecyan\u003c/cyan\u003e (color light cyan)\r\n\u003cmagenta\u003emagenta\u003c/magenta\u003e (color magenta)\r\n\u003ccol0/\u003e\u003ccol1/\u003e\u003ccol2/\u003e\u003ccol3/\u003e\u003ccol4/\u003e\u003ccol5/\u003e  columns. col0=0\r\n(left),col1--col5 every column of the page.\r\n\u003coption/\u003e it shows all the options available (if the input has some options)\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$content** content to display (string|string[])\r\n* **$cliOneParam** param ?CliOneParam $cliOneParam (?CliOneParam)\r\n* **$stream** =['stdout','stderr','memory'][$i] (?string)\r\n\r\n### Method clearScreen()\r\n\r\nIt clears the current screen\u003cbr\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003eclearScreen(); // clear the screen\r\n$this-\u003eclearScreen()-\u003ecursorHome(); // clear the screen and put the cursor at the home position\r\n```\r\n\r\n### Method cursorHome()\r\n\r\nIt sets the cursor to the top left position\u003cbr\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003ecursorHome(); // put the cursor at the home position\r\n```\r\n\r\n### Method cursorMove()\r\n\r\nIt moves the cursor at some specific position\u003cbr\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003ecursorMove('up',5); // move relatively 5 up\r\n$this-\u003ecursorMove('upmost',1); // move to the up position down 1.\r\n$this-\u003ecursorMove('down',5); // move relatively 5 down\r\n$this-\u003ecursorMove('downmost',2); // move to the down position up 2\r\n$this-\u003ecursorMove('right',10); // move relatively 5 right\r\n$this-\u003ecursorMove('rightmost',5); // move to the rightmost position, minus 5\r\n$this-\u003ecursorMove('left',10); // move relatively 5 left\r\n$this-\u003ecursorMove('leftmost',5); // move to the leftmost position, minus 5\r\n$this-\u003ecursorMove('pos',[10,10]); // move absolute to the position 10,10\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$type=['up','upmost','down','downmost','right','rightmost','left','leftmost','pos'][$i]** \u003cbr\u003e\r\n* **up** : it moves the cursor up \"n\" parameter\u003cbr\u003e\r\n* **down** : it moves the cursor down \"n\" parameter\u003cbr\u003e\r\n* **right** : it moves the cursor right \"n\" parameter\u003cbr\u003e\r\n* **left** : it moves the cursor left \"n\" parameter\u003cbr\u003e\r\n* **upmost** : it moves the cursor to the upper minus \"n\"\u003cbr\u003e\r\n* **downmost** : it moves the cursor to the down minus \"n\"\u003cbr\u003e\r\n* **rightmost** : it moves the cursor to the rightmost minus \"n\"\u003cbr\u003e\r\n* **leftmost** : it moves the cursor to the leftmost minus \"n\"\u003cbr\u003e\r\n* **pos** : it moves the cursor to the [x,y] parameter\u003cbr\u003e (string)\r\n* **$parameter** param mixed $parameter (mixed)\r\n\r\n### Method bell()\r\n\r\n### Method getCursorPosition()\r\n\r\nIt gets the current position of the cursor\r\n\r\n\u003e It requires getCh() executable up and configured in Windows\r\n\u003e **Example:**\r\n\r\n```\r\n$arr=$this-\u003egetCursorPosition(); // [x,y]\r\n```\r\n\r\n### Method showMessageBox()\r\n\r\nIt shows a message box consisting of two columns.\r\n\r\n#### Parameters:\r\n\r\n* **$lines** (right side) (string|string[])\r\n* **$titles** (left side) (string|string[])\r\n* **$wrapLines** if true, then $lines could be wrapped (if the lines are too long) (bool)\r\n\r\n### Method alignLinesVertically()\r\n\r\n#### Parameters:\r\n\r\n* **$lines** The lines to align (string[])\r\n* **$numberLines** the number of lines vertically to use to align the text. (int)\r\n* **$align** =['middle','top','bottom'][$i] (string)\r\n\r\n### Method maxWidth()\r\n\r\n### Method showParamSyntax()\r\n\r\nIt shows the syntax of a parameter.\r\n\r\n#### Parameters:\r\n\r\n* **$key** the key to show. \"*\" means all keys. (string)\r\n* **$tab** the first separation. Values are between 0 and 5. (int)\r\n* **$tab2** the second separation. Values are between 0 and 5. (int)\r\n* **$excludeKey** the keys to exclude. It must be an indexed array with the keys to skip. (array)\r\n\r\n### Method showParamSyntax2()\r\n\r\nIt shows the syntax of the parameters.\r\n\r\n#### Parameters:\r\n\r\n* **$title** A title (optional) (?string)\r\n* **$typeParam** =['command','first','last','second','flag','longflag','onlyinput','none'][$i] the\r\n  type of parameter (array)\r\n* **$excludeKey** the keys to exclude (array)\r\n* **$includeKeys** the whitelist of elements that only could be included.\u003cbr/\u003e\r\n  Only keys that are in this list are added. (array|null)\r\n* **$related** if not null then it only shows all the parameteres that are related.\u003cbr/\u003e\r\n  use $param-\u003esetRelated() to set the relation. (string|null)\r\n* **$size** the minimum size of the first column (?int)\r\n\r\n### Method setDefaultStream()\r\n\r\n#### Parameters:\r\n\r\n* **$stream** =['stdout','stderr','memory'][$i] (string)\r\n\r\n### Method setNoColor()\r\n\r\n#### Parameters:\r\n\r\n* **$noColor** if \u003cb\u003etrue\u003c/b\u003e then it will not show colors\u003cbr/\u003e\r\n  if \u003cb\u003efalse\u003c/b\u003e, then it will show the colors. (bool)\r\n\r\n### Method isNoColor()\r\n\r\n### Method setNoANSI()\r\n\r\nif true then the console is in old-cmd mode (no colors, no utf-8 characters, etc.)\r\n\r\n#### Parameters:\r\n\r\n* **$noANSI** param bool $noANSI (bool)\r\n\r\n### Method isNoANSI()\r\n\r\nreturns true if the\r\n\r\n### Method wrapLine()\r\n\r\nit wraps a line and returns one or multiples lines\u003cbr/\u003e\r\nThe lines wrapped does not open or close tags.\r\n\r\n#### Parameters:\r\n\r\n* **$texts** The text already formatted. (string|array)\r\n* **$width** The expected width (int)\r\n* **$keepStyle** if true then it keeps the initial and end style tag for every new line.\u003cbr/\u003e\r\n  if false, then it just wraps the lines. (bool)\r\n\r\n### Method showProgressBar()\r\n\r\n#### Parameters:\r\n\r\n* **$currentValue** the current value (numeric)\r\n* **$max** the max value to fill the bar. (numeric)\r\n* **$columnWidth** the size of the bar (in columns) (int)\r\n* **$currentValueText** the current value to display at the left.\u003cbr/\u003e\r\n  if null then it will show the current value (with a space in between) (?string)\r\n\r\n### Method getPageSize()\r\n\r\nit gets the size of the page (number of rows) to display in a table\r\n\r\n### Method showTable()\r\n\r\nIt shows an associative array.  This command is the end of a stack.\r\n\r\n#### Parameters:\r\n\r\n* **$assocArray** An associative array with the values to show. The key is used for the index. (array)\r\n* **$notop** if true then it will not show the top border (bool)\r\n* **$nosides** if true then it will not show the side borders (bool)\r\n* **$nobottom** if true then it will not show the bottom border (bool)\r\n* **$maxColumns** The max number of columns to show.\u003cbr/\u003e\r\n  If the table has 15 columns and maxColumns is 5, then only the\r\n  first 5 columns will be displayed. (int)\r\n* **$reduceRows** The number of rows to reduce considering the size of the screen.\u003cbr/\u003e\r\n  If the screen has 30 rows, then the table will use 30-3=27 rows\u003cbr/\u003e\r\n  If set to \u003e-99999, then it will display all rows. (int)\r\n* **$curpage** The number of page (base 1) to display. (int)\r\n\r\n### Method showValuesColumn()\r\n\r\nIt shows the values as columns.\r\n\r\n#### Parameters:\r\n\r\n* **$values** the values to show. It could be an associative array or an indexed array. (array)\r\n* **$type** ['multiple','multiple2','multiple3','multiple4','option','option2','option3','option4'][$i] (string)\r\n* **$patternColumn** the pattern to be used, example: \"\u003ccyan\u003e[{key}]\u003c/cyan\u003e {value}\" (?string)\r\n\r\n### Method showWaitCursor()\r\n\r\nIt shows a waiting cursor.\u003cbr\u003e\r\n**Example:**\r\n\r\n```\r\n$this-\u003ehideCursor()-\u003eshowWaitCursor(true);\r\n$this-\u003eshowWaitCursor(); // inside a loop.\r\n$this-\u003ehideWaitCursor()-\u003eshowCursor(); // at the end of the loop\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$init** the first time this method is called, you must set this value as true. Then,\r\n  every update must be false. (bool)\r\n* **$postfixValue** if you want to set a profix value such as percentage, advance, etc. (string)\r\n\r\n### Method hideWaitCursor()\r\n\r\n### Method hideCursor()\r\n\r\n### Method showCursor()\r\n\r\n### Method showparams()\r\n\r\nIt will show all the parameters by showing the key, the default value and the value\u003cbr/\u003e\r\nIt is used for debugging and testing.\r\n\r\n### Method showParamValue()\r\n\r\n#### Parameters:\r\n\r\n* **$parameter** param CliOneParam $parameter (CliOneParam)\r\n\r\n### Method strlen()\r\n\r\nIt determines the size of a string\r\n\r\n#### Parameters:\r\n\r\n* **$content** param $content ()\r\n* **$visual** visual means that it considers the visual lenght, false means it considers characters. (bool)\r\n\r\n### Method removechar()\r\n\r\nremove visible characters at the end of the string. It ignores invisible (such as colors) characters.\r\n\r\n#### Parameters:\r\n\r\n* **$content** param string $content (string)\r\n* **$numchar** param int $numchar (int)\r\n\r\n### Method upLevel()\r\n\r\nUp a level in the breadcrumb\r\n\r\n#### Parameters:\r\n\r\n* **$content** the content of the new line (string)\r\n* **$type** the type of the content (optional) (string)\r\n\r\n### Method getCh()\r\n\r\nIt reads an input character. It does not work with special characters\u003cbr\u003e\r\nThis function is basic, it does not work with all keystrokes, and it could be CPU intensive (for a loop)\u003cbr\u003e\r\n\r\n\u003e In Windows, it uses the getch.exe in any path folder (or you can set the path with $this-\u003egetChWinExe).\u003cbr\u003e\r\n\u003e You can download from here https://github.com/escuelainformatica/getch/releases\r\n\u003e **Example:**\r\n\r\n```\r\n$chNumber=$this-\u003egetCh(); // wait until it reads a character\r\nwhile(true) {\r\n$chNumber=$this-\u003egetCh(false); // does not wait.\r\nusleep(50); // if you don't add a pause, it uses the CPU 100%\r\n}\r\n$chChar=$this-\u003egetCh(false,false); // it gets a character instead of a number\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$waitUntilKeyPress** if true (default), it waits until a key is pressed (bool)\r\n* **$asNumber** if true (default), returns the result as a two byte integer. (bool)\r\n\r\n### Method colorText()\r\n\r\nIt sets the color of the cli\u003cbr/\u003e\r\n\r\n```\r\n\u003cred\u003eerror\u003c/red\u003e (color red)\r\n\u003cyellow\u003ewarning\u003c/yellow\u003e (color yellow)\r\n\u003cblue\u003einformation\u003c/blue\u003e (blue)\r\n\u003cyellow\u003eyellow\u003c/yellow\u003e (yellow)\r\n\u003cgreen\u003egreen\u003c/green\u003e  (color green)\r\n\u003citalic\u003eitalic\u003c/italic\u003e\r\n\u003cbold\u003ebold\u003c/bold\u003e\r\n\u003cunderline\u003eunderline\u003c/underline\u003e\r\n\u003cstrikethrough\u003estrikethrough\u003c/strikethrough\u003e\r\n\u003ccyan\u003ecyan\u003c/cyan\u003e (color light cyan)\r\n\u003cmagenta\u003emagenta\u003c/magenta\u003e (color magenta)\r\n\u003ccol0/\u003e\u003ccol1/\u003e\u003ccol2/\u003e\u003ccol3/\u003e\u003ccol4/\u003e\u003ccol5/\u003e  columns. col0=0 (left),col1--col5 every column of the page.\r\n\u003coption/\u003e it shows all the options available (if the input has some options)\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$content** param string $content (string)\r\n* **$cliOneParam** param ?CliOneParam $cliOneParam (?CliOneParam)\r\n\r\n### Method colorLess()\r\n\r\nIt removes all the escape characters of a content\r\n\r\n#### Parameters:\r\n\r\n* **$content** param string $content (string)\r\n\r\n### Method colorMask()\r\n\r\nIt masks (with a char 250) all the escape characters.\r\n\r\n#### Parameters:\r\n\r\n* **$content** param $content ()\r\n\r\n### Method initialEndStyle()\r\n\r\nIt returns the initial and end style of a text.\u003cbr/\u003e\r\nIf the text only contains an initial or final style, then nothing is returned\r\n\r\n#### Parameters:\r\n\r\n* **$contentAnsi** the content text already formatted in Ansi (string)\r\n* **$initial** (this value is returned) (?string)\r\n* **$end** (this value is returned) (?string)\r\n\r\n### Method replaceCurlyVariable()\r\n\r\nReplaces all variables defined between {{ }} by a variable inside the dictionary of values.\u003cbr/\u003e\r\n**Example:**\r\n\r\n```\r\nreplaceCurlyVariable('hello={{var}}',['var'=\u003e'world']) // hello=world\r\nreplaceCurlyVariable('hello={{var}}',['varx'=\u003e'world']) // hello=\r\nreplaceCurlyVariable('hello={{var}}',['varx'=\u003e'world'],true) // hello={{var}}\r\n```\r\n\r\n#### Parameters:\r\n\r\n* **$string** The input value. It could contain variables defined as {{namevar}} (string)\r\n* **$notFoundThenKeep** [false] If true and the value is not found, then it keeps the value.\r\n  Otherwise, it is replaced by an empty value (bool)\r\n\r\n\r\n\r\n## menu\r\n\r\nYou can create a menu using the next methods\r\n\r\n### addMenu()\r\nIt creates a new menu\r\n\r\n### addMenuItem()\r\nIt adds an option to a menu\r\n\r\n### addMenuItems()\r\nIt adds multiple options to a menu\r\n\r\n### evalMenu()\r\nIt executes a menu\r\n\r\n### clearMenu()\r\nIt clears a menu.\r\n\r\n### example\r\n```php\r\nclass ClassService {\r\n  public function menuHeader(CliOne $cli) { /* todo: add header code */ }\r\n  public function menuFooter(CliOne $cli) { /* todo: add footer code */ }\r\n  public function menuOption1(CliOne $cli) { /* todo: add menu option 1 code */ }\r\n  public function menuOption2(CliOne $cli) { /* todo: add menu option 2 code */ }\r\n}\r\n$obj=new ClassService();\r\n\r\n$cli = new CliOne();\r\n$cli-\u003eaddMenu('menu1', 'header','footer');\r\n$cli-\u003eaddMenuItem('menu1','option1', 'option #1'\r\n  ,function($cli) {$cli-\u003eshowLine('calling action1');$this-\u003eassertTrue(true, true);});\r\n$cli-\u003eaddMenuItem('menu1','option2', 'option #2');\r\n$cli-\u003eaddMenuItem('menu1','option3', 'option #3','navigate:menu1.1');\r\n$cli-\u003eaddMenuItems('menu1',['option4'=\u003e'option #4','option5'=\u003e 'option #5']); // adding multiples options\r\n\r\n$cli-\u003eaddMenu('menu1.1', 'header2','footer2');\r\n$cli-\u003eaddMenuItem('menu1.1','option1', 'option #1.1');\r\n$cli-\u003eaddMenuItem('menu1.1','option2', 'option #2.1');\r\n$cli-\u003eaddMenuItem('menu1.1','option3', 'option #3.1');\r\n$cli-\u003eaddMenuItem('menu1.1','option4', 'option #4.1');\r\n$cli-\u003eaddMenuItem('menu1.1','option5', 'option #5.1');\r\n$cli-\u003eevalMenu('menu1',$obj); // runs the menu.\r\n$cli-\u003eshowLine('exit ok');\r\n$cli-\u003eclearMenu();\r\n```\r\n\r\n## Examples\r\n\r\n### Example using arguments\r\n\r\n[example/example1.php](example/example1.php)\r\n\r\nAnd create the next code\r\n\r\n```php\r\n// example1.php\r\n// don't forget to add autoloader, namespace, etc.\r\n$cli=new CliOne(); // instance of the library\r\nif($cli-\u003eisCli()) { // we validate if we are running a CLI or not.\r\n  $cli-\u003ecreateParam('param1') // the name of the parameter\r\n        -\u003esetDescription('Some description','question?') // description and question\r\n        -\u003esetRequired(true) // if the field is required\r\n        -\u003esetDefault('param1') // the default value If the value is not found\r\n        -\u003eadd(); // it adds a parameter to the cli\r\n  $param1=$cli-\u003eevalParam('param1'); // then we evaluate the parameter.\r\n  var_dump($param1-\u003evalue);  \r\n}\r\n```\r\n\r\nSo you can run as:\r\n\r\n![](docs/example1.jpg)\r\n\r\n### Example using user input\r\n\r\nYou can ask for user input of the user.\r\n\r\n[example/example2.php](example/example2.php)\r\n\r\n```php\r\n$cli=new CliOne();\r\nif($cli-\u003eisCli()) {\r\n    $cli-\u003ecreateParam('param1')\r\n        -\u003esetDescription('This field is called param1 and it is required')\r\n        -\u003esetInput(true,'string')\r\n        -\u003esetRequired(true)\r\n        -\u003esetDefault('param1')\r\n        -\u003eadd();\r\n    $param1 = $cli-\u003eevalParam('param1');\r\n    var_dump($param1-\u003evalue);\r\n}\r\n```\r\n\r\nIt will show the next result\r\n\r\n![](docs/example2.jpg)\r\n\r\n### Example with a game\r\n\r\n[example/examplegame.php](example/examplegame.php)\r\n\r\n![docs/guess.jpg](docs/guess.jpg)\r\nImage (c) George Beker\r\n\r\n![docs/examplegame.jpg](docs/examplegame.jpg)\r\n\r\n### Example colors\r\n\r\nYou can see the tags available in [Types of colors](#types-of-colors)\r\n\r\n[example/examplecolor.php](example/examplecolor.php)\r\n\r\n```php\r\n$cli-\u003eshowLine(\"\u003cbold\u003ebold\u003c/bold\u003e\");\r\n$cli-\u003eshowLine(\"\u003cdim\u003edim\u003c/dim\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbred\u003ebackground red\u003c/bred\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003ebackground red\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbwhite\u003e\u003cblack\u003ebackground white\u003c/black\u003e \u003c/bwhite\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbyellow\u003e\u003cblue\u003ebackground yellow\u003c/blue\u003e\u003c/byellow\u003e\");\r\n$cli-\u003eshowLine(\"\u003cred\u003eerror\u003c/red\u003e (color red)\");\r\n$cli-\u003eshowLine(\"\u003cyellow\u003ewarning\u003c/yellow\u003e (color yellow)\");\r\n$cli-\u003eshowLine(\"\u003cblue\u003einformation\u003c/blue\u003e (blue)\");\r\n$cli-\u003eshowLine(\"\u003cyellow\u003eyellow\u003c/yellow\u003e (yellow)\");\r\n$cli-\u003eshowLine(\"\u003cgreen\u003egreen\u003c/green\u003e (color green)\");\r\n$cli-\u003eshowLine(\"\u003citalic\u003eitalic\u003c/italic\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbold\u003ebold\u003c/bold\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbold\u003e\u003cyellow\u003ebold yellow\u003c/yellow\u003e\u003c/bold\u003e\");\r\n$cli-\u003eshowLine(\"\u003cstrikethrough\u003estike\u003c/strikethrough\u003e\");\r\n$cli-\u003eshowLine(\"\u003cunderline\u003eunderline\u003c/underline\u003e\");\r\n$cli-\u003eshowLine(\"\u003ccyan\u003ecyan\u003c/cyan\u003e (color cyan)\");\r\n$cli-\u003eshowLine(\"\u003cmagenta\u003emagenta\u003c/magenta\u003e (color magenta)\");\r\n$cli-\u003eshowLine(\"\u003cbold\u003e\u003ccyan\u003ebold cyan\u003c/cyan\u003e\u003c/bold\u003e (color cyan)\");\r\n$cli-\u003eshowLine(\"\u003cbold\u003e\u003cmagenta\u003ebold magenta\u003c/magenta\u003e\u003c/bold\u003e (color magenta)\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol0/\u003e col0\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol1/\u003e col1\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol2/\u003e col2\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol3/\u003e col3\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol4/\u003e col4\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"\u003cbblue\u003e\u003ccol1/\u003e col1 \u003ccol3/\u003e col3 \u003ccol5/\u003e col5\u003c/bblue\u003e\");\r\n$cli-\u003eshowLine(\"The parameters of option are: \u003coption/\u003e\",$cli-\u003egetParameter('test'));\r\n```\r\n\r\n![](docs/examplecolor.jpg)\r\n\r\n### Example tables\r\n\r\n[example/exampletables.php](example/exampletables.php)\r\n\r\n![docs/exampletable.jpg](docs/exampletable.jpg)\r\n\r\n## Types of user input\r\n\r\n| userinput    | description                                                             |\r\n|--------------|-------------------------------------------------------------------------|\r\n| number       | the value must be a number                                              |\r\n| range        | the value must be a number between a range of values                    |\r\n| string       | the value must be a string (by default, nulls are not string)           |\r\n| password     | the value must be a string (and if it is displayed, then it shows ****) |\r\n| multiple     | It allows to select one or many values displated in 1 column            |\r\n| multiple2    | The same than multiple but displayed in 2 columns                       |\r\n| multiple3    | The same than multiple but displayed in 3 columns                       |\r\n| multiple4    | The same than multiple but displayed in 4 columns                       |\r\n| option       | It allows to select one from many values displayed in a column          |\r\n| option2      | The same than option but displayed in 2 columns                         |\r\n| option3      | The same than option but displayed in 3 columns                         |\r\n| option4      | The same than option but displayed in 4 columns                         |\r\n| optionsimple | It allows to select one from many values. It doesn't use columns        |\r\n\r\n## Types of colors\r\n\r\n| tag                                        | description                   |\r\n|--------------------------------------------|-------------------------------|\r\n| \u003cred\u003eerror\u003c/red\u003e                           | color red                     |\r\n| \u003cyellow\u003ewarning\u003c/yellow\u003e                   | color yellow                  |\r\n| \u003cblue\u003einformation\u003c/blue\u003e                   | blue                          |\r\n| \u003cblack\u003eblack\u003c/black\u003e                       | black                         |\r\n| \u003cwhite\u003ewhite\u003c/white\u003e                       | white                         |\r\n| \u003cgreen\u003esuccess\u003c/green\u003e                     | color green                   |\r\n| \u003citalic\u003eitalic\u003c/italic\u003e                    | italic                        |\r\n| \u003cbold\u003ebold\u003c/body\u003e                          | bold                          |\r\n| \u003cunderline\u003eunderline\u003c/underline\u003e           | underline                     |\r\n| \u003ccyan\u003ecyan\u003c/cyan\u003e                          | color light cyan              |\r\n| \u003cmagenta\u003emagenta\u003c/magenta\u003e                 | color magenta                 |\r\n| \u003ccol0/\u003e\u003ccol1/\u003e\u003ccol2/\u003e\u003ccol3/\u003e\u003ccol4/\u003e\u003ccol5/\u003e | col0 leftmost column          |\r\n| \u003coption/\u003e                                  | if the input has some options |\r\n| \u003cbred\u003ered\u003c/bred\u003e                           | background color red          |\r\n| \u003cbyellow\u003e\u003cbblue\u003e..                         | background color              |\r\n\r\n## Definitions\r\n\r\nYou can find the definition of the classes, methods and fields at:\r\n\r\n[definitions.md](definitions.md)\r\n\r\n## debug\r\nTo activate the debug mode, you must set the debug field as true:\r\n```\r\n$cli=new CliOne();\r\n$cli-\u003edebug=true;\r\n```\r\nIn debug mode, every user input is recored in the field $debugHistory\r\n\r\nYou can also see the history running the input ??history\r\n\r\n![](docs/help1.jpg)\r\n\r\nAnd you can clear the history using the input ??clear\r\n\r\nThe goal is we could store a session and replace it using testUserInput()\r\n\r\nYou can also load and save the user input\r\n* **??history** it shows the history\r\n* **??clear** it clears the history\r\n* **??load** it load the user input and runs it.\r\n* **??save** it saves the user input in a file called _save.json\r\n* **??load:file** **??save:file** you can also specify the filename where it will be saved\r\n\r\n\r\n```php\r\n$cli = new CliOne();\r\nCliOne::testUserInput([...]); // put your story here.\r\n```\r\n\r\n\r\n## Compatibility\r\n\r\n* It must support all moderns interface that are compatibles with Virtual Terminal.\r\n* Since Windows TH2 (v1511, 2015), cmd.exe and powershell.exe has supports or VT, but it must be enabled.\r\n    * REG ADD HKCU\\CONSOLE /f /v VirtualTerminalLevel /t REG_DWORD /d 1\r\n* Since Windows 10 Anniversary Edition (v1607, 2016), cmd.exe and powershell.exe has default supports of VT (AFAIK)\r\n* Windows 2019 (LTS, 2018) supports this library by default.\r\n* Windows Terminal supports all features.\r\n* The screen size width is -1 column less in older version of Windows. C'mon, Microsoft!\r\n\r\n## Changelog\r\n* 1.35 (2024-09-23)\r\n  *  **new** method clearScreen()\r\n  *  **new** method cursorHome()\r\n  *  **new** method cursorMove()\r\n  *  **new** method bell()\r\n  *  **new** method getCursorPosition()\r\n  *  **fixed** fixed some comments.\r\n* 1.34 (2024-09-20)\r\n  * fixed a couple of bugs in showTable().\r\n  * fixed comments in the code\r\n* 1.33 (2024-08-02)\r\n  * json_encode does not throw an exception. Now it fails with empty or default value. \r\n* 1.32.1 (2024-03-02)\r\n  * fixed some fields, default values and type hinting.\r\n* 1.32 (2024-03-02)\r\n  * Updating dependency to PHP 7.4. The extended support of PHP 7.2 ended 3 years ago.\r\n  * Added more type hinting in the code. \r\n* 1.31 (23-09-02)\r\n  * new methods:\r\n    * hideCursor()\r\n    * showCursor()\r\n  * modified method:\r\n    * setStyle() now allows two arguments.\r\n* 1.30 (23-09-02)\r\n  * Best identification of the version of Windows. 10.1607 and higher is considered compatible.\r\n  * Fixed: scroll and wait cursor now work correctly.\r\n  * Preliminary Container.\r\n* 1.29.1 (23-04-06)\r\n  * Fixed a bug with addMenuService() \r\n* 1.29 (23-04-06)\r\n  * In the debug mode, you can ??load, ??save the operations. \r\n* 1.28 (2023-04-05)\r\n  * the $debug field, so you can debug and store the user input history.\r\n  * PHP_FAKE_READLINE constant or global variable now is a static field $fakeReadLine\r\n* 1.27 (2023-04-02)\r\n  * new method instance() so you can get or create a new singleton instance.\r\n  * new method hasInstance()\r\n  * new method hasMenu()\r\n  * new method addMenuService()\r\n  * fixed a bug with showHelp() and the help is an array or the help is missing.\r\n* 1.26.1 (2023-03-21)\r\n  * cleaned some code. \r\n* 1.26 (2023-03-21)\r\n  * addMenu() and addMenuItem() allow to use callable arguments. \r\n* 1.25.1 (2023-03-20)\r\n  * Fixed a small bug with evalMenu()\r\n  * Added option to addMenu() ($size)\r\n* 1.25 (2023-03-20)\r\n  * Added method clearMenu(),addMenu(),addMenuItem(),addMenuItems(),evalMenu()\r\n  * Added method setVariable(),getVariable() and addVariableCallBack().  $variable field is now private.\r\n* 1.24 (2023-03-11)\r\n  * Added new method createOrReplaceParam(),setParamUsingArray(),getValueAsArray()\r\n  * setParam() has a new argument to create the parameter if it is not defined.\r\n  * Added variables that could be displayed when the text contains \"{{namevar}}\"\r\n* 1.23 (2023-03-05)\r\n    * Added new methods readDataPHPFormat() and saveDataPHPFormat()\r\n    * readDate() and saveData() generate a file that includes the version and the date of generation. It does not impact\r\n      older files.\r\n* 1.22.3 (2023-03-04)\r\n    * fixed a small bug when some value is null. It could throw a warning in PHP\r\n* 1.22.2 (2023-02-17)\r\n    * some cleanups\r\n* 1.22.1 (2022-7-30)\r\n    * fix a small typo in the code.\r\n* 1.22 (2022-07-30)\r\n    * setInput() added format wide to use 1 column (if the screen is equal or less than 80 columns) or two columns\r\n    * \"option\" ignore cases.\r\n* 1.21 (2022-06-27)\r\n    * showMessageBox() now support colors and line carriage.\r\n* 1.20 (2022-06-21)\r\n    * showMessageBox() added wrap lines\r\n    * updated the way to find if an array is associative or not.\r\n* 1.19 (2022-06-18)\r\n    * Update the creation of table\r\n* 1.18.1 (2022-06-17)\r\n    * Fixed a bug when we use setCurrentAsDefault() but the type of value is an option (we set the default the valuekey\r\n      instead of the value)\r\n* 1.18 (2022-06-11)\r\n    * Added the method addExtensionFile()\r\n* 1.17 (2022-06-09)\r\n    * fixed many problems with Linux (number of rows, autocomplete, etc.)\r\n* 1.16 (2022-03-25)\r\n    * setParam() allows to set the value or the value-key\r\n* 1.15 (2022-03-15)\r\n    * showHelp() shows more information.\r\n    * colorText() now correct some missing tags.\r\n* 1.14 (2022-03-04)\r\n    * method showTable() allows to show or hide the top, sides and bottom borders.\r\n* 1.13 (2022-02-28)\r\n    * Changed silentError to errorType\r\n* 1.12 (2022-02-26)\r\n    * CliOne:\r\n        * added a memory stream\r\n        * set the default stream\r\n        * set the current stream to use stdout,stderr or memory (stdin is not used for in)\r\n        * added a new parameter type \"command\" that it is equals than first, but it ignores the name and considers the\r\n          position.\r\n        * added the method showHelp()\r\n        * added the method makeBigWords()\r\n        * added fontZnaki()\r\n        * added fontaatr()\r\n            * both fonts use a lot of space in code, but they are only an array of bits, so they use only 2KB.\r\n        * new method alignLinesVertically()\r\n        * new method maxWidth()\r\n        * renamed field cmdMode to noANSI\r\n        * method initialEndStyle()\r\n    * CliOneParam:\r\n        * Added a field related.\r\n* 1.11 (2022-02-22)\r\n    * Added supports for STDIN, STDOUT, and STDERR.\r\n* 1.10 (2022-02-21)\r\n    * **[new]** support for the old command line (cmd.exe). It is activated automatically.\r\n        * It degraded the colors to b\u0026w and changes the utf-8 characters to be compatible.\r\n        * Also, the scroll bar and the waiting cursor is not displayed in this mode.\r\n        * See compatibility for more information.\r\n\r\n* 1.9 (2022-02-20)\r\n    * **[new]** argumentIsValueKey and memory\r\n    * **[changed]** **Changed the signature of createParam(), switched the second and third argument**\r\n* 1.8 (2022-02-20)\r\n    * **[new]** setParam() throw an exception if the parameter is not defined.\r\n    * **[new]** showParamSyntax2()\r\n    * **[new]** CliOneParam::$nameArg name of the argument (used in help)\r\n* 1.7 (2022-02-18)\r\n    * **[fix]** added type hinting for most fields and methods.\r\n    * **[new]** new setValue() for CliOneParam.\r\n* 1.6.1 (2022-02-18)\r\n    * **[fix]** fixed a small bug with the value is set manually, so it is still marked as missing.\r\n* 1.6 (2022-02-18)\r\n    * **[new]** new method isParameterPresent()\r\n* 1.5.5 (2022-02-18)\r\n    * getParameter() always returns a parameter, no matter if it does not exist.\r\n        * You can use the method isValid() to check its validity\r\n    * setSilentError() you can silent the error output.\r\n    * addhistory() renamed as setAddHistory()\r\n    * To add a new parameter add() validates if the key is already in use, if the key is an alias of other, or if the\r\n      alias is in use.\r\n* 1.5.4 (2022-02-18)\r\n    * fixed a problem with the default value.\r\n    * added history (if available)\r\n* 1.5.3 (2022-02-18)\r\n    * nothing, just a renumeration\r\n* 1.5.2 (2022-02-18)\r\n    * **[fix]** some cleanups of the code.\r\n* 1.5.1 (2022-02-18)\r\n    * **[fix]** fixed a problem when the type is \"none\", it returned null instead of false.\r\n    * **[new]** CliOneParam::evalParam() could return the value instead of the instance.\r\n* 1.5 (2022-02-17)\r\n    * **[fix]** corrected the display and trim of some text when the text uses a color.\r\n    * **[new]** it allows multiples types of arguments (not only flags), including positional, flags, long-flags are\r\n      none.\r\n    * **[new]** added stack. Some visual elements allows to stack values.\r\n* 1.4.1 (2022-02-15)\r\n    * **[fix]** some fix for characters thare unicode. The system will use automatically MB_STRING if the library is\r\n      available.\r\n      Otherwise, it will use the default library\r\n    * **[new]** new styles and patterns for components.\r\n* 1.4 (2022-02-15)\r\n    * **[replaced]** now all colors are express not abbreviated \"\u003ce\u003e\" =\u003e \"\u003cred\u003e\", etc.\r\n    * **[new]** added all basic colors, background and solved a problem with the underline.\r\n    * **[new]** added showFrame(),showTable(),showWaitCursor(),showProgressBar()\r\n* 1.3 (2022-02-14)\r\n    * **[new]** added autocomplete (tab key)\r\n    * **[new]** added breadcrub\r\n    * **[new]** added showValuesColumn()\r\n    * **[replaced]** now keys (showing in options) are aligned at the center.\r\n* 1.2.2 (2022-02-14)\r\n    * **[fixed]** fixed a problem where the question is truncated with an ellipsis (...)\r\n* 1.2.1 (2022-02-13)\r\n    * **[fixed]** fixed some bugs\r\n    * **[new]** keys are padded, example /[ 1] /[ 2] /[ 3] ... [99], /[value 1] /[value 2] /[value  ]\r\n* 1.2 (2022-02-13)\r\n    * **[replaced]** \"options\" renamed as \"multiple\". Added \"multiple2\",\"multiple3\",\"multiple4\"\r\n    * **[new]** associative arrays are allowed.\r\n    * **[new]** added templates.\r\n    * **[new]** added valuekey.\r\n* 1.1 (2022-02-12)\r\n    * **[new]** new methods savedata(),getArrayParams(),setArrayParam(),readData()\r\n    * **[replaced]** a new argument for the method replaceColor()\r\n    * **[new]** a new type called password\r\n* 1.0.1 (2022-02-11)\r\n    * **[Fixed]** namespace.\r\n    * **[Fixed]** replaceColor() fixed a color\r\n    * **[Added]** CliOne::indVendorPath()\r\n* 1.0 (2022-02-11)\r\n    * End of beta, first release.\r\n* 0.7 (2022-02-11)\r\n    * Added option4.\r\n    * optionshorts allows to specify the first letter, only if the first letter is unique, examples: yes/no allows to\r\n      use y/n\r\n* 0.6 (2022-02-11)\r\n    * Added option2 and option3\r\n    * allowNulls() now doesn't work with default values.\r\n* 0.5 (2022-02-03)\r\n    * [unittest] Better unit test.\r\n    * [CliOneParam] You can set if you allow empty values or not.\r\n    * [CliOne] You can set if you allow empty values or not.\r\n* 0.4 (2022-01-27) Now test coverage is over the 75%\r\n* 0.3 (2022-01-26) new corrections to the reading of values\r\n* 0.2 some updates\r\n* 0.1 first version\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Fclione","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feftec%2Fclione","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feftec%2Fclione/lists"}