適当なコマンドラインパーサ その2

もう少しましになるように書き直し。


class CLP
def initialize(keys={})
@keys = keys
@opts = {}
@args =
end

def hook(key, len=0)
@keys[key] = len;
end

def parse(args)
while prm = args.shift
if (prm =~ %r|^[-/]|) && @keys.has_key?($')
key = $'
buf =
@keys[key].times {
break if args.empty? || args.first =~ %r|^[-/]|
buf << args.shift
}
if @keys[key] < 2
@opts[key] = buf.empty? ? "" : buf.first
else
@opts[key] = buf
end
else
@args << prm
end
end
end

def [](nth)
return @args[nth]
end

def method_missing(name, *args)
return args.empty? ? @opts[name.to_s] : super
end
end


clp = CLP.new("o1"=>0, "o2"=>1)
p ARGV #=> ["-o1", "-o2", "foo", "bar", "zoo"]
clp.parse(ARGV)
p clp.o1 #=> ""
p clp.o2 #=> "foo"
p clp.o3 #=> nil
p clp[0] #=> "bar"
p clp[1] #=> "zoo"

適当なコマンドラインパーサ

ライブラリないのかな?


def clp(argv)
params = {}
while param = argv.shift
if param =~ /^-.+/
param = param.sub("-", "")
vals = clpvals(argv)
case vals.length
when 0
params[param] = nil
when 1
params[param] = vals.first
else
params[param] = vals
end
end
end
return params
end

def clpvals(argv)
vals = []
until argv.empty? or argv.first =~ /^-.+/
vals << argv.shift
end
return vals
end

DOMの要素をツリー状につなげる

DOMをもっと直感的に扱えないか、と思っていろいろ試行錯誤。


<html>
<head>
<title>DOM->obj?</title>
<script language="JavaScript">
<!--
function relay(node) {
var c = node.childNodes;
for(var i=0; i<c.length; i++) {
var name = c[i].nodeName;
name = (name == '#text') ? '_text' : name.toLowerCase();
if(!node[name]) node[name] = new Array();
node[name].push(c[i]);
relay(c[i]);
}
}

function main() {
var d = window.document;
relay(d.body);
d.body.table[0].border = 1;
var zoo = d.body.table[0].tbody[0].tr[1].td[0]._text[0];
zoo.appendData(" zoo");
}
//-->
</script>
</head>
<body onLoad="main();">
<table>
<tbody>
<tr>
<td>foo</td>
<td>bar</td>
</tr>
<tr>
<td>zoo</td>
<td>baz</td>
</tr>
</tbody>
</table>
</body>
</html>

添え字がちょっと鬱陶しい。問題がある気もするし。
もうちょっとうまい方法はないかな…