liquid_feedback_frontend
annotate utils/optparse.lua @ 157:24e47baf5f9b
strip html from fallback title
if the slot is used for title, make sure the html is stripped from it
if the slot is used for title, make sure the html is stripped from it
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Fri Oct 08 20:31:09 2010 +0200 (2010-10-08) |
parents | eeb167cf9dc4 |
children |
rev | line source |
---|---|
poelzi@107 | 1 -- Lua command line option parser. |
poelzi@107 | 2 -- Interface based on Pythons optparse. |
poelzi@107 | 3 -- http://docs.python.org/lib/module-optparse.html |
poelzi@107 | 4 -- (c) 2008 David Manura, Licensed under the same terms as Lua (MIT license) |
poelzi@107 | 5 -- |
poelzi@107 | 6 -- To be used like this: |
poelzi@107 | 7 -- t={usage="<some usage message>", version="<version string>"} |
poelzi@107 | 8 -- op=OptionParser(t) |
poelzi@107 | 9 -- op=add_option{"<opt>", action=<action>, dest=<dest>, help="<help message for this option>"} |
poelzi@107 | 10 -- |
poelzi@107 | 11 -- with : |
poelzi@107 | 12 -- <opt> the option string to be used (can be anything, if one letter opt, then should be -x val, more letters: -xy=val ) |
poelzi@107 | 13 -- <action> one of |
poelzi@107 | 14 -- - store: store in options as key, val |
poelzi@107 | 15 -- - store_true: stores key, true |
poelzi@107 | 16 -- - store_false: stores key, false |
poelzi@107 | 17 -- <dest> is the key under which the option is saved |
poelzi@107 | 18 -- |
poelzi@107 | 19 -- options,args = op.parse_args() |
poelzi@107 | 20 -- |
poelzi@107 | 21 -- now options is the table of options (key, val) and args is the table with non-option arguments. |
poelzi@107 | 22 -- You can use op.fail(message) for failing and op.print_help() for printing the usage as you like. |
poelzi@107 | 23 |
poelzi@107 | 24 --module('utils.optparse') |
poelzi@107 | 25 |
poelzi@107 | 26 local function OptionParser(t) |
poelzi@107 | 27 local usage = t.usage |
poelzi@107 | 28 local version = t.version |
poelzi@107 | 29 local commands = t.commands |
poelzi@107 | 30 |
poelzi@107 | 31 local o = {} |
poelzi@107 | 32 local option_descriptions = {} |
poelzi@107 | 33 local option_of = {} |
poelzi@107 | 34 |
poelzi@107 | 35 function o.fail(s) -- extension |
poelzi@107 | 36 io.stderr:write(s .. '\n') |
poelzi@107 | 37 os.exit(1) |
poelzi@107 | 38 end |
poelzi@107 | 39 |
poelzi@107 | 40 function o.add_option(optdesc) |
poelzi@107 | 41 option_descriptions[#option_descriptions+1] = optdesc |
poelzi@107 | 42 for _,v in pairs(optdesc) do |
poelzi@107 | 43 option_of[v] = optdesc |
poelzi@107 | 44 end |
poelzi@107 | 45 end |
poelzi@107 | 46 function o.parse_args() |
poelzi@107 | 47 -- expand options (e.g. "--input=file" -> "--input", "file") |
poelzi@107 | 48 local arg = {unpack(arg)} |
poelzi@107 | 49 for i=#arg,1,-1 do local v = arg[i] |
poelzi@107 | 50 local flag, val = v:match('^(%-%-%w+)=(.*)') |
poelzi@107 | 51 if flag then |
poelzi@107 | 52 arg[i] = flag |
poelzi@107 | 53 table.insert(arg, i+1, val) |
poelzi@107 | 54 end |
poelzi@107 | 55 end |
poelzi@107 | 56 |
poelzi@107 | 57 local options = {} |
poelzi@107 | 58 for _,optdesc in ipairs(option_descriptions) do |
poelzi@107 | 59 options[optdesc["dest"]] = optdesc.default |
poelzi@107 | 60 end |
poelzi@107 | 61 local args = {} |
poelzi@107 | 62 local i = 1 |
poelzi@107 | 63 while i <= #arg do local v = arg[i] |
poelzi@107 | 64 local optdesc = option_of[v] |
poelzi@107 | 65 if optdesc then |
poelzi@107 | 66 local action = optdesc.action |
poelzi@107 | 67 local val |
poelzi@107 | 68 if action == 'store' or action == nil then |
poelzi@107 | 69 i = i + 1 |
poelzi@107 | 70 val = arg[i] |
poelzi@107 | 71 if not val then o.fail('option requires an argument ' .. v) end |
poelzi@107 | 72 elseif action == 'store_true' then |
poelzi@107 | 73 val = true |
poelzi@107 | 74 elseif action == 'store_false' then |
poelzi@107 | 75 val = false |
poelzi@107 | 76 end |
poelzi@107 | 77 options[optdesc.dest] = val |
poelzi@107 | 78 else |
poelzi@107 | 79 if v:match('^%-') then o.fail('invalid option ' .. v) end |
poelzi@107 | 80 args[#args+1] = v |
poelzi@107 | 81 end |
poelzi@107 | 82 i = i + 1 |
poelzi@107 | 83 end |
poelzi@107 | 84 if options.help then |
poelzi@107 | 85 o.print_help() |
poelzi@107 | 86 os.exit() |
poelzi@107 | 87 end |
poelzi@107 | 88 if options.version then |
poelzi@107 | 89 io.stdout:write(t.version .. "\n") |
poelzi@107 | 90 os.exit() |
poelzi@107 | 91 end |
poelzi@107 | 92 return options, args |
poelzi@107 | 93 end |
poelzi@107 | 94 |
poelzi@107 | 95 local function flags_str(optdesc) |
poelzi@107 | 96 local sflags = {} |
poelzi@107 | 97 local action = optdesc.action |
poelzi@107 | 98 for _,flag in ipairs(optdesc) do |
poelzi@107 | 99 local sflagend |
poelzi@107 | 100 if action == nil or action == 'store' then |
poelzi@107 | 101 local metavar = optdesc.metavar or optdesc.dest:upper() |
poelzi@107 | 102 sflagend = #flag == 2 and ' ' .. metavar |
poelzi@107 | 103 or '=' .. metavar |
poelzi@107 | 104 else |
poelzi@107 | 105 sflagend = '' |
poelzi@107 | 106 end |
poelzi@107 | 107 sflags[#sflags+1] = flag .. sflagend |
poelzi@107 | 108 end |
poelzi@107 | 109 return table.concat(sflags, ', ') |
poelzi@107 | 110 end |
poelzi@107 | 111 |
poelzi@107 | 112 function o.print_help() |
poelzi@107 | 113 io.stdout:write("Usage: " .. usage:gsub('%%prog', arg[0]) .. "\n") |
poelzi@107 | 114 io.stdout:write("\n") |
poelzi@107 | 115 io.stdout:write("Options:\n") |
poelzi@107 | 116 for _,optdesc in ipairs(option_descriptions) do |
poelzi@107 | 117 io.stdout:write(" " .. flags_str(optdesc) .. |
poelzi@107 | 118 " " .. optdesc.help .. "\n") |
poelzi@107 | 119 end |
poelzi@107 | 120 if commands then |
poelzi@107 | 121 io.stdout:write("\nCommands:\n") |
poelzi@107 | 122 for _,command in ipairs(commands) do |
poelzi@107 | 123 io.stdout:write(" " .. command[1] .. |
poelzi@107 | 124 string.rep(" ", 30-#command[1]) .. |
poelzi@107 | 125 command[2] .. "\n") |
poelzi@107 | 126 end |
poelzi@107 | 127 end |
poelzi@107 | 128 |
poelzi@107 | 129 end |
poelzi@107 | 130 o.add_option{"--help", action="store_true", dest="help", |
poelzi@107 | 131 help="show this help message and exit"} |
poelzi@107 | 132 if t.version then |
poelzi@107 | 133 o.add_option{"--version", action="store_true", dest="version", |
poelzi@107 | 134 help="output version info."} |
poelzi@107 | 135 end |
poelzi@107 | 136 return o |
poelzi@107 | 137 end |
poelzi@107 | 138 |
poelzi@107 | 139 return OptionParser |