please add long comment :).
あぁ,現実逃避に chm を作りまくってしまった.
# parse GNU global outputs and generate hhp, etc
def make_hhp id, title
<<EOS__
[OPTIONS]
Compiled file=#{id}.chm
Default topic=index.html
Title= #{title}
Language=0x411 日本語
Compatibility=1.1 or later
Contents file=toc
Display compile progress=Yes
Full-text search=Yes
Index file=idx
[FILES]
#{
Dir.glob('**/*.html').join("\n")
}
[INFOTYPES]
EOS__
end
def ary2toc ary
<<EOS__
<UL>
#{
ary.map{|e|
if e.kind_of? Array
ary2toc e
else
<<-EOS
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="#{e[:name]}">
<param name="Local" value="#{e[:value]}">
</OBJECT>
EOS
end
}.join("\n")
}
</UL>
EOS__
end
def read_map file
open(file).map{|line|
line.chomp!
if /(.+)\s(.+)/ =~ line
{:name => $1, :value => $2}
end
}.compact
end
def make_idx
idx = read_map('MAP')
<<EOS__
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="texi2html4hh">
<!-- Sitemap 1.0 -->
</HEAD>
<BODY>
#{ary2toc idx}
</BODY>
</HTML>
EOS__
end
def make_toc
toc = [
{:name => 'Index', :value => 'index.html'},
{:name => 'Mains', :value => 'mains.html'},
{:name => 'Defines', :value => 'defines.html'},
{:name => 'Files', :value => 'files.html'},
read_map('FILEMAP')
]
<<EOS__
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="texi2html4hh">
<!-- Sitemap 1.0 -->
</HEAD>
<BODY>
#{ary2toc toc}
</BODY>
</HTML>
EOS__
end
hhp = make_hhp('ruby-1.8.4-src', 'Ruby 1.8.4')
toc = make_toc
idx = make_idx
open('global.hhp', 'w'){|f| f.write hhp}
open('toc', 'w'){|f| f.write toc}
open('idx', 'w'){|f| f.write idx}
現実逃避の産物.
ruby-1.8.4-src.chm こんなのが出来た.さて,これ便利なんだろうか.1.9 じゃないから便利じゃなさげ.
a, x/a, x/b, x/y/a, x/y/b, ... みたいなものを,[a, x, [a, b, y, [a, b]]] みたいに変換する簡単な方法は....
とりあえず.
p m = ['a', 'x/a', 'x/y/a', 'x/b', 'x/z/a', 'b'].map{|f|
f.split('/')
}
def parse ary
h = {}
return nil if ary[0].size == 0
ary.each{|e|
if h[e[0]]
h[e[0]] << e[1..-1]
else
h[e[0]] = [e[1..-1]]
end
}
h.sort.map{|k, v|
[k, parse(v)]
}
end
require 'pp'
pp m = parse(m)
def last ary
m = []
ary.each{|e|
m << e[0]
if e[1]
m << last(e[1])
end
}
m
end
pp m = last(m)
#=>
[["a"], ["x", "a"], ["x", "y", "a"], ["x", "b"], ["x", "z", "a"], ["b"]]
[["a", nil],
["b", nil],
["x", [["a", nil], ["b", nil], ["y", [["a", nil]]], ["z", [["a", nil]]]]]]
["a", "b", "x", ["a", "b", "y", ["a"], "z", ["a"]]]
まぁ,望む答えなんだけど,とてもかっこ悪い気がする.
好きなだけ長いコメントをどうぞ。
tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。
「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。
例:
#code (なんかプログラム書く) #end
リンクは
[[なまえ|http://www.example.org]] とか [[http://www.example.org]]
で貼れます。
仕様がよくわからないけど。
(use srfi-1) (use gauche.collection) (use util.match) (define (p input) ((rec (r lis) (append-map (match-lambda (((x)) `(,x)) (((x . y) ...) `(,(car x) ,(r y)))) (group-collection lis :key car :test equal?))) (map (cut string-split <> #\/) (sort input)))) gosh> (p '("a" "x/a" "x/y/a" "x/b" "x/z/a" "b")) ("a" "b" "x" ("a" "b" "y" ("a") "z" ("a")))class N def initialize(n= nil) @n, @c= n, {} end def /(n) @c[n]||= N.new(n) end def build return [@n] if @c.empty? res= @c.values.inject([]){|r,e| r+= e.build } res= [@n, res] if @n res end end def trans(src) t= N.new src.each{|e| o= t; e.each{|n| o/= n } } t.build end src= ['a', 'x/a', 'x/y/a', 'x/b', 'x/z/a', 'b'].map{|e| e.split('/') } p trans(src)