From 8a30eb331c858f412b67a6edc7e45c2c94cdaea7 Mon Sep 17 00:00:00 2001 From: mpeterv Date: Sun, 2 Mar 2014 19:18:36 +0400 Subject: [PATCH] Added docs, updated README --- README.md | 103 +++- doc/images/bg_hr.png | Bin 0 -> 943 bytes doc/images/blacktocat.png | Bin 0 -> 1428 bytes doc/index.html | 832 ++++++++++++++++++++++++++++++ doc/stylesheets/pygment_trac.css | 70 +++ doc/stylesheets/stylesheet.css | 423 +++++++++++++++ rockspecs/argparse-git-1.rockspec | 5 +- 7 files changed, 1410 insertions(+), 23 deletions(-) create mode 100644 doc/images/bg_hr.png create mode 100644 doc/images/blacktocat.png create mode 100644 doc/index.html create mode 100644 doc/stylesheets/pygment_trac.css create mode 100644 doc/stylesheets/stylesheet.css diff --git a/README.md b/README.md index 0bf5fff..29ed011 100644 --- a/README.md +++ b/README.md @@ -4,34 +4,95 @@ argparse is a feature-rich command line parser for Lua inspired by argparse for Python. +argparse supports positional arguments, options, flags, optional arguments, subcommands and more. argparse automatically generates usage, help and error messages. + +Quick glance: + +```lua +-- script.lua +local argparse = require "argparse" +local parser = argparse() + :description "An example." +parser:argument "input" + :description "Input file." +parser:option "-o" "--output" + :default "a.out" + :description "Output file." +parser:option "-I" "--include" + :count "*" + :description "Include locations." +local args = parser:parse() +prettyprint(args) +``` + +```bash +$ lua script.lua foo +``` + +``` +input: foo +output: a.out +include: {} +``` + +```bash +$ lua script.lua foo -I/usr/local/include -I/src -o bar +``` + +``` +input: foo +output: bar +include: {/usr/local/include, /src} +``` + +```bash +$ lua script.lua foo bar +``` + +``` +Usage: script.lua [-o ] [-I ] [-h] + +Error: too many arguments +``` + +```bash +$ lua script.lua --help +``` + +``` +Usage: script.lua [-o ] [-I ] [-h] + +An example. + +Arguments: + input Input file. + +Options: + -o , --output + Output file. (default: a.out) + -I , --include + Include locations. + -h, --help Show this help message and exit. +``` + +```bash +$ lua script.lua foo --outptu=bar +``` + +``` +Usage: script.lua [-o ] [-I ] [-h] + +Error: unknown option '--outptu' +Did you mean '--output'? +``` + ## Contents -* [Status](#status) * [Installation](#installation) * [Tutorial](#tutorial) * [Testing](#testing) * [License](#license) -## Status - -Almost everything is implemented, and a WIP version will be available soon. - -TODO till first release: - -* Add `Content` section to this README. -* Add a small example to the beginning of this README. -* Check the grammar in this README. -* Generate .html file from the tutorial part of this README and put it into `doc` directory. -* Write a rockspec for `v0.1` and push it to moonrocks. - -TODO till first 'stable' release: - -* Write a formal reference. -* Write more tests. Some cases are still poorly covered. -* Add mutually exclusive groups(`:mutex{option1, option2, ...}`). -* Optionally(?): Add comments to the source. -* Optionally: get rid of `30log` dependency. It's great but can cause problems with old luarocks versions. - ## Installation ### Using luarocks diff --git a/doc/images/bg_hr.png b/doc/images/bg_hr.png new file mode 100644 index 0000000000000000000000000000000000000000..7973bd69888c7e10ccad1111d555ceabb7cd99b6 GIT binary patch literal 943 zcmaJ=O^ee&7!FiK7FWCot{@Ck@nrMW&tx0B-6VAbrk1u~FTzffX&bu9#AIsIdef8t z!QZfdz=K}>3m(LO;6X3qN}Y6@>cJYA%)G<%Jn!ec>9im1@7>wsIBwrMF}iHO!q%;8 zSJ@xEd~(FL18NRvkBsOXMVM>4WQc*~qcQGc17IjxRnj!O_^B1gan0x#EWT48PK->5B2>mI;LIx zC*FSw$Nfc!g)WZCEOJ=mM)}lLsOk|$ltg_(&ax_YCWMlBLPDVT%D_gB7o_$YZ`-OB z#1sV%whRq21>W;qwN$N?OUGtQQe;JvOsQrna;+v+j8dth=*?orHHb6waX>S!yXCgT zo!oR3{E&GzaOAzfZYv@_Sf{LdyJInS>TS60&R9%yCs$y>2x(*gYIJtRrYAja$Ceq} z!N&oc_K1!3-Ft`U>`CM;quEbB4KG%!MovB*9_3!QzFhqHwrbwK|Doo-y>auDJNSP6 T=d)j*_4El@X4^PFK7I8YBT*xD literal 0 HcmV?d00001 diff --git a/doc/images/blacktocat.png b/doc/images/blacktocat.png new file mode 100644 index 0000000000000000000000000000000000000000..6e264fe57a2e35a2855405ac7d4102c3f6ddcdae GIT binary patch literal 1428 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L-^Aq1JP;qO z-q+X4Gq1QLF)umQ)5TT^Xo6m5W{Q=eg`=5?o13Glvx}*rp{t>#shg3DvyriZv5}jZ ztD`wguSMv>2~2MaLa!4}y`ZF!TL84#CABECEH%ZgC_h&L>}9J=EN(GzcCm0X zaRr%YgxxI=y(w7S0@dq`Q?EYIG5Vm0MT%&c5HR(CnDAr^T6f1avxRvmvnsN+?-j}Z~1)Zr#rqzrt`edmo44*B<0=C4>mrxHF6$p zVws~UocMfeI`gB8pYMLYTzA87`NOI2w2B*JM5L`^AkN4AFQu&S+6ULTPjv;vzl4& z-eaK_F|D4~l3hzBSF~icNT@MID=v+_X`vpuvf=8+S(|^vlRdHe0<)v-^wiVR3w=TQ)uFA9F z>vmq + + + + + + + + + + Argparse tutorial + + + + + +
+
+ View on GitHub + +

Argparse tutorial

+

+
+
+ + +
+
+

+Creating a parser

+ +

The module is a function which, when called, creates an instance of the Parser class.

+ +
-- script.lua
+local argparse = require "argparse"
+local parser = argparse()
+
+ +

parser is now an empty parser which does not recognize any command line arguments or options.

+ +

+Parsing command line arguments

+ +

:parse([cmdline]) method of the Parser class returns a table with processed data from the command line or cmdline array.

+ +
local args = parser:parse()
+for k, v in pairs(args) do print(k, v) end
+
+ +

When executed, this script prints nothing because the parser is empty and no command line arguments were supplied.

+ +
$ lua script.lua
+
+ +

+Error handling

+ +

If the provided command line arguments are not recognized by the parser, it will print an error message and call os.exit(1).

+ +
$ lua script.lua foo
+
+ +
Usage: script.lua [-h]
+
+Error: too many arguments
+
+ +

If halting the program is undesirable, :pparse([cmdline]) method should be used. It returns boolean flag indicating success of parsing and result or error message.

+ +

An error can raised manually using :error() method.

+ +
parser:error("manual argument validation failed")
+
+ +
Usage: script.lua [-h]
+
+Error: manual argument validation failed
+
+ +

+Help option

+ +

As the automatically generated usage message states, there is a help option -h added to any parser by default.

+ +

When a help option is used, parser will print a help message and call os.exit(0).

+ +
$ lua script.lua -h
+
+ +
Usage: script.lua [-h]
+
+Options: 
+   -h, --help            Show this help message and exit. 
+
+ +

+Typo autocorrection

+ +

When an option is not recognized by the parser, but there is an option with a similar name, a suggestion is automatically added to the error message.

+ +
$ lua script.lua --hepl
+
+ +
Usage: script.lua [-h]
+
+Error: unknown option '--hepl'
+Did you mean '--help'?
+
+ +

+Configuring parser

+ +

Parsers have several fields affecting their behavior. For example, description field sets the text to be displayed in the help message between the usage message and the listings of options and arguments. Another is name, which overwrites the name of the program which is used in the usage message(default value is inferred from command line arguments).

+ +

There are several ways to set fields. The first is to call a parser with a table containing some fields.

+ +
local parser = argparse() {
+   name = "script",
+   description = "A testing script. "
+}
+
+ +

The second is to chain setter methods of Parser object.

+ +
local parser = argparse()
+   :name "script"
+   :description "A testing script. "
+
+ +

As a special case, name field can be set by calling a parser with a string.

+ +
local parser = argparse "script"
+   :description "A testing script. "
+
+ +

+Adding arguments

+ +

Positional arguments can be added using :argument() method. It returns an Argument instance, which can be configured in the same way as Parsers. The name field is required.

+ +
parser:argument "input" -- sugar for :argument():name "input"
+
+ +
$ lua script.lua foo
+
+ +
input   foo
+
+ +

The data passed to the argument is stored in the result table at index input because it is the argument's name. The index can be changed using target field.

+ +

+Setting number of arguments

+ +

args field sets how many command line arguments the argument consumes. Its value is interpreted as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueInterpretation
Number N +Exactly N arguments
String "A-B", where A and B are numbersFrom A to B arguments
String "N+", where N is a number +N or more arguments
String "?" +An optional argument
String "*" +Any number of arguments
String "+" +At least one argument

If more than one argument can be passed, a table is used to store the data.

+ +
parser:argument "pair"
+   :args(2)
+   :description "A pair of arguments. "
+parser:argument "optional"
+   :args "?"
+   :description "An optional argument. "
+
+ +
$ lua script.lua foo bar
+
+ +
pair    {foo, bar}
+
+ +
$ lua script.lua foo bar baz
+
+ +
pair    {foo, bar}
+optional    baz
+
+ +

+Adding options

+ +

Options can be added using :option() method. It returns an Option instance, which can be configured in the same way as Parsers. The name field is required. An option can have several aliases, which can be set using aliases field or by continuously calling the Option instance.

+ +
parser:option "-f" "--from"
+
+ +
$ lua script.lua --from there
+$ lua script.lua --from=there
+$ lua script.lua -f there
+$ lua script.lua -fthere
+
+ +
from    there
+
+ +

For an option, default index used to store data is the first 'long' alias (an alias starting with two control characters) or just the first alias, without control characters.

+ +

Sometimes it is useful to explicitly set the index using target field to improve readability of help messages.

+ +
parser:option "-f" "--from"
+   :target "server"
+
+ +
$ lua script.lua --help
+
+ +
Usage: script.lua [-f <server>] [-h]
+
+Options: 
+   -f <server>, --from <server>
+   -h, --help            Show this help message and exit. 
+
+ +
$ lua script.lua --from there
+
+ +
server  there
+
+ +

+Flags

+ +

Flags are almost identical to options, except that they don't take an argument by default.

+ +
parser:flag "-q" "--quiet"
+
+ +
$ lua script.lua -q
+
+ +
quiet   true
+
+ +

+Control characters

+ +

The first characters of all aliases of all options of a parser form the set of control characters, used to distinguish options from arguments. Typically the set only consists of a hyphen.

+ +

+Setting number of arguments

+ +

Just as arguments, options can be configured to take several command line arguments.

+ +
parser:option "--pair"
+   :args(2)
+parser:option "--optional"
+   :args "?"
+
+ +
$ lua script.lua --pair foo bar
+
+ +
pair    {foo, bar}
+
+ +
$ lua script.lua --pair foo bar --optional
+
+ +
pair    {foo, bar}
+optional    {}
+
+ +
$ lua script.lua --optional=baz
+
+ +
optional    {baz}
+
+ +

Note that the data passed to optional option is stored in an array. That is necessary to distinguish whether the option was invoked without an argument or it was not invoked at all.

+ +

+Setting number of invocations

+ +

For options, it is possible to control how many times they can be used. argparse uses count field to set how many times an option can be invoked. The value of the field is interpreted in the same way args is.

+ +
parser:option "-e" "--exclude"
+   :count "*"
+
+ +
$ lua script.lua -eFOO -eBAR
+
+ +
exclude {FOO, BAR}
+
+ +

If an option can be used more than once and it can consume more than one argument, the data is stored as an array of invocations, each being an array of arguments.

+ +

As a special case, if an option can be used more than once and it consumes no arguments(e.g. it's a flag), than the number of invocations is stored in associated field of the result table.

+ +
parser:flag "-v" "--verbose"
+   :count "0-2"
+   :target "verbosity"
+   :description [[Sets verbosity level. 
+-v: Report all warning. 
+-vv: Report all debugging information. ]]
+
+ +
$ lua script.lua -vv
+
+ +
verbosity   2
+
+ +

+Commands

+ +

A command is a subparser invoked when its name is passed as an argument. For example, in luarocks CLI install, make, build, etc. are commands. Each command has its own set of arguments and options.

+ +

Commands can be added using :command() method. Just as options, commands can have several aliases.

+ +
parser:command "install" "i"
+
+ +

If a command it used, true is stored in the corresponding field of the result table.

+ +
$ lua script.lua install
+
+ +
install true
+
+ +

A typo will result in an appropriate error message:

+ +
$ lua script.lua instal
+
+ +
Usage: script.lua [-h] <command> ...
+
+Error: unknown command 'instal'
+Did you mean 'install'?
+
+ +

+Adding elements to commands

+ +

The Command class is a subclass of the Parser class, so all the Parser's methods for adding elements work on commands, too.

+ +
local install = parser:command "install"
+install:argument "rock"
+install:option "-f" "--from"
+
+ +
$ lua script.lua install foo --from=bar
+
+ +
install true
+rock    foo
+from    bar
+
+ +

Commands have their own usage and help messages.

+ +
$ lua script.lua install
+
+ +
Usage: script.lua install [-f <from>] [-h] <rock>
+
+Error: too few arguments
+
+ +
$ lua script.lua install --help
+
+ +
Usage: script.lua install [-f <from>] [-h] <rock>
+
+Arguments: 
+   rock
+
+Options: 
+   -f <from>, --from <from>
+   -h, --help            Show this help message and exit. 
+
+ +

+Making a command optional

+ +

By default, if a parser has commands, using one of them is obligatory.

+ +
local parser = argparse()
+parser:command "install"
+
+ +
$ lua script.lua
+
+ +
Usage: script.lua [-h] <command> ...
+
+Error: a command is required
+
+ +

This can be changed using the require_command field.

+ +
local parser = argparse()
+   :require_command(false)
+parser:command "install"
+
+ +

Now not using a command is not an error:

+ +
$ lua script.lua
+
+ +

produces nothing.

+ +

+Default values

+ +

For elements such as arguments and options, if default field is set, its value is stored in case the element was not used.

+ +
parser:option "-o" "--output"
+   :default "a.out"
+
+ +
$ lua script.lua
+
+ +
output  a.out
+
+ +

The existence of a default value is reflected in help message.

+ +
$ lua script.lua --help
+
+ +
Usage: script [-o <output>] [-h]
+
+Options: 
+   -o <output>, --output <output>
+                         default: a.out
+   -h, --help            Show this help message and exit. 
+
+ +

Note that invocation without required arguments is still an error.

+ +
$ lua script.lua -o
+
+ +
Usage: script [-o <output>] [-h]
+
+Error: too few arguments
+
+ +

+Default mode

+ +

The defmode field regulates how argparse should use the default value of an element.

+ +

If defmode contains "u"(for unused), the default value will be automatically passed to the element if it was not invoked at all. This is the default behavior.

+ +

If defmode contains "a"(for argument), the default value will be automatically passed to the element if not enough arguments were passed, or not enough invocations were made.

+ +

Consider the difference:

+ +
parser:option "-o"
+   :default "a.out"
+parser:option "-p" 
+   :default "password"
+   :defmode "arg"
+
+ +
$ lua script.lua -h
+
+ +
Usage: script [-o <o>] [-p [<p>]] [-h]
+
+Options: 
+   -o <o>                default: a.out
+   -p [<p>]              default: password
+   -h, --help            Show this help message and exit. 
+
+ +
$ lua script.lua
+
+ +
o   a.out
+
+ +
$ lua script.lua -p
+
+ +
o   a.out
+p   password
+
+ +
$ lua script.lua -o
+
+ +
Usage: script [-o <o>] [-p [<p>]] [-h]
+
+Error: too few arguments
+
+ +

+Converters

+ +

argparse can perform automatic validation and conversion on arguments. If convert field of an element is a function, it will be applied to all the arguments passed to it. The function should return nil and, optionally, an error message if conversion failed. Standard tonumber and io.open functions work exactly like that.

+ +
parser:argument "input"
+   :convert(io.open)
+parser:option "-t" "--times"
+   :convert(tonumber)
+
+ +
$ lua script.lua foo.txt -t5
+
+ +
input   file (0xaddress)
+times   5 (number)
+
+ +
$ lua script.lua nonexistent.txt
+
+ +
Usage: script.lua [-t <times>] [-h] <input>
+
+Error: nonexistent.txt: No such file or directory
+
+ +
$ lua script.lua foo.txt --times=many
+
+ +
Usage: script.lua [-t <times>] [-h] <input>
+
+Error: malformed argument 'many'
+
+ +

+Table converters

+ +

If convert field of an element contains a table, arguments passed to it will be used as keys. If a key is missing, an error is raised.

+ +
parser:argument "choice"
+   :convert {
+      foo = "Something foo-related",
+      bar = "Something bar-related"
+   }
+
+ +
$ lua script.lua bar
+
+ +
choice  Something bar-related
+
+ +
$ lua script.lua baz
+
+ +
Usage: script.lua [-h] <choice>
+
+Error: malformed argument 'baz'
+
+ +

+Actions

+ +

argparse can trigger a callback when an option or a command is encountered. The callback can be set using action field. Actions are called regardless of whether the rest of command line arguments are correct.

+ +
parser:flag "-v" "--version"
+   :description "Show version info and exit. "
+   :action(function()
+      print("script.lua v1.0.0")
+      os.exit(0)
+   end)
+
+ +
$ lua script.lua -v
+
+ +
script.lua v1.0.0
+
+ +

This example would work even if the script had mandatory arguments.

+ +

+Miscellaneous

+ +

+Overwriting default help option

+ +

If the field add_help of a parser is set to false, no help option will be added to it. Otherwise, the value of the field will be used to configure it.

+ +
local parser = argparse()
+   :add_help {name = "/?"}
+
+ +
$ lua script.lua /?
+
+ +
Usage: script.lua [/?]
+
+Options: 
+   /?                    Show this help message and exit.
+
+ +

+Configuring usage and help messages

+ +

+Description and epilog

+ +

The value of description field of a parser is placed between the usage message and the argument list in the help message.

+ +

The value of epilog field is appended to the help message.

+ +
local parser = argparse "script"
+   :description "A description. "
+   :epilog "An epilog. "
+
+ +
$ lua script.lua --help
+
+ +
Usage: script [-h]
+
+A description. 
+
+Options: 
+   -h, --help            Show this help message and exit. 
+
+An epilog. 
+
+ +

+Argument placeholder

+ +

For options and arguments, argname field controls the placeholder for the argument in the usage message.

+ +
parser:option "-f" "--from"
+   :argname "<server>"
+
+ +
$ lua script.lua --help
+
+ +
Usage: script.lua [-f <server>] [-h]
+
+Options: 
+   -f <server>, --from <server>
+   -h, --help            Show this help message and exit. 
+
+ +

+Prohibiting overuse of options

+ +

By default, if an option is invoked too many times, latest invocations overwrite the data passed earlier.

+ +
parser:option "-o" "--output"
+
+ +
$ lua script.lua -oFOO -oBAR
+
+ +
output   BAR
+
+ +

Set the overwrite field to false to prohibit this behavior.

+ +
parser:option "-o" "--output"
+   :overwrite(false)
+
+ +
$ lua script.lua -oFOO -oBAR
+
+ +
Usage: script.lua [-o <output>] [-h]
+
+Error: option '-o' must be used at most 1 time
+
+ +

+Generating usage and help messages

+ +

:get_help() and get_usage:() methods of Parser and Command classes can be used to generate their help and usage messages.

+ +

+Parsing algorithm

+ +

argparse interprets command line arguments in the following way:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArgumentInterpretation
fooAn argument of an option or a positional argument.
--fooAn option.
--foo=barAn option and its argument. The option must be able to take arguments.
-fAn option.
-abcdefLetters are interpreted as options. If one of them can take an argument, the rest of the string is passed to it.
--The rest of the command line arguments will be interpreted as positional arguments.
+
+
+ + + + + + + + diff --git a/doc/stylesheets/pygment_trac.css b/doc/stylesheets/pygment_trac.css new file mode 100644 index 0000000..e65cedf --- /dev/null +++ b/doc/stylesheets/pygment_trac.css @@ -0,0 +1,70 @@ +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f0f3f3; } +.highlight .c { color: #0099FF; font-style: italic } /* Comment */ +.highlight .err { color: #AA0000; background-color: #FFAAAA } /* Error */ +.highlight .k { color: #006699; font-weight: bold } /* Keyword */ +.highlight .o { color: #555555 } /* Operator */ +.highlight .cm { color: #0099FF; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #009999 } /* Comment.Preproc */ +.highlight .c1 { color: #0099FF; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #0099FF; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #003300; font-weight: bold } /* Generic.Heading */ +.highlight .gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */ +.highlight .go { color: #AAAAAA } /* Generic.Output */ +.highlight .gp { color: #000099; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #003300; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #99CC66 } /* Generic.Traceback */ +.highlight .kc { color: #006699; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #006699; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #006699; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #006699 } /* Keyword.Pseudo */ +.highlight .kr { color: #006699; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #007788; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #FF6600 } /* Literal.Number */ +.highlight .s { color: #CC3300 } /* Literal.String */ +.highlight .na { color: #330099 } /* Name.Attribute */ +.highlight .nb { color: #336666 } /* Name.Builtin */ +.highlight .nc { color: #00AA88; font-weight: bold } /* Name.Class */ +.highlight .no { color: #336600 } /* Name.Constant */ +.highlight .nd { color: #9999FF } /* Name.Decorator */ +.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CC0000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #CC00FF } /* Name.Function */ +.highlight .nl { color: #9999FF } /* Name.Label */ +.highlight .nn { color: #00CCFF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #330099; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #003333 } /* Name.Variable */ +.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #FF6600 } /* Literal.Number.Float */ +.highlight .mh { color: #FF6600 } /* Literal.Number.Hex */ +.highlight .mi { color: #FF6600 } /* Literal.Number.Integer */ +.highlight .mo { color: #FF6600 } /* Literal.Number.Oct */ +.highlight .sb { color: #CC3300 } /* Literal.String.Backtick */ +.highlight .sc { color: #CC3300 } /* Literal.String.Char */ +.highlight .sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #CC3300 } /* Literal.String.Double */ +.highlight .se { color: #CC3300; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #CC3300 } /* Literal.String.Heredoc */ +.highlight .si { color: #AA0000 } /* Literal.String.Interpol */ +.highlight .sx { color: #CC3300 } /* Literal.String.Other */ +.highlight .sr { color: #33AAAA } /* Literal.String.Regex */ +.highlight .s1 { color: #CC3300 } /* Literal.String.Single */ +.highlight .ss { color: #FFCC33 } /* Literal.String.Symbol */ +.highlight .bp { color: #336666 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #003333 } /* Name.Variable.Class */ +.highlight .vg { color: #003333 } /* Name.Variable.Global */ +.highlight .vi { color: #003333 } /* Name.Variable.Instance */ +.highlight .il { color: #FF6600 } /* Literal.Number.Integer.Long */ + +.type-csharp .highlight .k { color: #0000FF } +.type-csharp .highlight .kt { color: #0000FF } +.type-csharp .highlight .nf { color: #000000; font-weight: normal } +.type-csharp .highlight .nc { color: #2B91AF } +.type-csharp .highlight .nn { color: #000000 } +.type-csharp .highlight .s { color: #A31515 } +.type-csharp .highlight .sc { color: #A31515 } diff --git a/doc/stylesheets/stylesheet.css b/doc/stylesheets/stylesheet.css new file mode 100644 index 0000000..7a08b01 --- /dev/null +++ b/doc/stylesheets/stylesheet.css @@ -0,0 +1,423 @@ +/******************************************************************************* +Slate Theme for GitHub Pages +by Jason Costello, @jsncostello +*******************************************************************************/ + +@import url(pygment_trac.css); + +/******************************************************************************* +MeyerWeb Reset +*******************************************************************************/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +ol, ul { + list-style: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/******************************************************************************* +Theme Styles +*******************************************************************************/ + +body { + box-sizing: border-box; + color:#373737; + background: #212121; + font-size: 16px; + font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5, h6 { + margin: 10px 0; + font-weight: 700; + color:#222222; + font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif; + letter-spacing: -1px; +} + +h1 { + font-size: 36px; + font-weight: 700; +} + +h2 { + padding-bottom: 10px; + font-size: 32px; + background: url('../images/bg_hr.png') repeat-x bottom; +} + +h3 { + font-size: 24px; +} + +h4 { + font-size: 21px; +} + +h5 { + font-size: 18px; +} + +h6 { + font-size: 16px; +} + +p { + margin: 10px 0 15px 0; +} + +footer p { + color: #f2f2f2; +} + +a { + text-decoration: none; + color: #007edf; + text-shadow: none; + + transition: color 0.5s ease; + transition: text-shadow 0.5s ease; + -webkit-transition: color 0.5s ease; + -webkit-transition: text-shadow 0.5s ease; + -moz-transition: color 0.5s ease; + -moz-transition: text-shadow 0.5s ease; + -o-transition: color 0.5s ease; + -o-transition: text-shadow 0.5s ease; + -ms-transition: color 0.5s ease; + -ms-transition: text-shadow 0.5s ease; +} + +a:hover, a:focus {text-decoration: underline;} + +footer a { + color: #F2F2F2; + text-decoration: underline; +} + +em { + font-style: italic; +} + +strong { + font-weight: bold; +} + +img { + position: relative; + margin: 0 auto; + max-width: 739px; + padding: 5px; + margin: 10px 0 10px 0; + border: 1px solid #ebebeb; + + box-shadow: 0 0 5px #ebebeb; + -webkit-box-shadow: 0 0 5px #ebebeb; + -moz-box-shadow: 0 0 5px #ebebeb; + -o-box-shadow: 0 0 5px #ebebeb; + -ms-box-shadow: 0 0 5px #ebebeb; +} + +p img { + display: inline; + margin: 0; + padding: 0; + vertical-align: middle; + text-align: center; + border: none; +} + +pre, code { + width: 100%; + color: #222; + background-color: #fff; + + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 14px; + + border-radius: 2px; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; +} + +pre { + width: 100%; + padding: 10px; + box-shadow: 0 0 10px rgba(0,0,0,.1); + overflow: auto; +} + +code { + padding: 3px; + margin: 0 3px; + box-shadow: 0 0 10px rgba(0,0,0,.1); +} + +pre code { + display: block; + box-shadow: none; +} + +blockquote { + color: #666; + margin-bottom: 20px; + padding: 0 0 0 20px; + border-left: 3px solid #bbb; +} + + +ul, ol, dl { + margin-bottom: 15px +} + +ul { + list-style: inside; + padding-left: 20px; +} + +ol { + list-style: decimal inside; + padding-left: 20px; +} + +dl dt { + font-weight: bold; +} + +dl dd { + padding-left: 20px; + font-style: italic; +} + +dl p { + padding-left: 20px; + font-style: italic; +} + +hr { + height: 1px; + margin-bottom: 5px; + border: none; + background: url('../images/bg_hr.png') repeat-x center; +} + +table { + border: 1px solid #373737; + margin-bottom: 20px; + text-align: left; + } + +th { + font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif; + padding: 10px; + background: #373737; + color: #fff; + } + +td { + padding: 10px; + border: 1px solid #373737; + } + +form { + background: #f2f2f2; + padding: 20px; +} + +/******************************************************************************* +Full-Width Styles +*******************************************************************************/ + +.outer { + width: 100%; +} + +.inner { + position: relative; + max-width: 640px; + padding: 20px 10px; + margin: 0 auto; +} + +#forkme_banner { + display: block; + position: absolute; + top:0; + right: 10px; + z-index: 10; + padding: 10px 50px 10px 10px; + color: #fff; + background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%; + font-weight: 700; + box-shadow: 0 0 10px rgba(0,0,0,.5); + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +#header_wrap { + background: #212121; + background: -moz-linear-gradient(top, #373737, #212121); + background: -webkit-linear-gradient(top, #373737, #212121); + background: -ms-linear-gradient(top, #373737, #212121); + background: -o-linear-gradient(top, #373737, #212121); + background: linear-gradient(top, #373737, #212121); +} + +#header_wrap .inner { + padding: 50px 10px 30px 10px; +} + +#project_title { + margin: 0; + color: #fff; + font-size: 42px; + font-weight: 700; + text-shadow: #111 0px 0px 10px; +} + +#project_tagline { + color: #fff; + font-size: 24px; + font-weight: 300; + background: none; + text-shadow: #111 0px 0px 10px; +} + +#downloads { + position: absolute; + width: 210px; + z-index: 10; + bottom: -40px; + right: 0; + height: 70px; + background: url('../images/icon_download.png') no-repeat 0% 90%; +} + +.zip_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom left; +} + +.tar_download_link { + display: block; + float: right; + width: 90px; + height:70px; + text-indent: -5000px; + overflow: hidden; + background: url(../images/sprite_download.png) no-repeat bottom right; + margin-left: 10px; +} + +.zip_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top left; +} + +.tar_download_link:hover { + background: url(../images/sprite_download.png) no-repeat top right; +} + +#main_content_wrap { + background: #f2f2f2; + border-top: 1px solid #111; + border-bottom: 1px solid #111; +} + +#main_content { + padding-top: 40px; +} + +#footer_wrap { + background: #212121; +} + + + +/******************************************************************************* +Small Device Styles +*******************************************************************************/ + +@media screen and (max-width: 480px) { + body { + font-size:14px; + } + + #downloads { + display: none; + } + + .inner { + min-width: 320px; + max-width: 480px; + } + + #project_title { + font-size: 32px; + } + + h1 { + font-size: 28px; + } + + h2 { + font-size: 24px; + } + + h3 { + font-size: 21px; + } + + h4 { + font-size: 18px; + } + + h5 { + font-size: 14px; + } + + h6 { + font-size: 12px; + } + + code, pre { + min-width: 320px; + max-width: 480px; + font-size: 11px; + } + +} diff --git a/rockspecs/argparse-git-1.rockspec b/rockspecs/argparse-git-1.rockspec index 5db8133..416b863 100644 --- a/rockspecs/argparse-git-1.rockspec +++ b/rockspecs/argparse-git-1.rockspec @@ -5,7 +5,7 @@ source = { } description = { summary = "A feature-rich command-line argument parser", - detailed = "argparse allows you to define positional arguments, options, flags and default values. Provides automatically generated usage, error and help messages. Supports subcommands and generates a hint when a command or an option is mistyped. ", + detailed = "argparse supports positional arguments, options, flags, optional arguments, subcommands and more. argparse automatically generates usage, help and error messages. ", homepage = "https://github.com/mpeterv/argparse", license = "MIT/X11" } @@ -17,5 +17,6 @@ build = { type = "builtin", modules = { argparse = "src/argparse.lua" - } + }, + copy_directories = {"doc", "spec"} }