K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_7(Sat)

あぁ,現実逃避に 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]]] みたいに変換する簡単な方法は....


ruby-1.9.0-src.chm

とりあえず.


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"]]]

まぁ,望む答えなんだけど,とてもかっこ悪い気がする.

_shiro(Sat Jan 07 17:45:06 JST 2006)

仕様がよくわからないけど。

(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")))
_デフォルトの名無しさん(Sun Jan 08 03:43:59 JST 2006)
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)

好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $