[#34988] BigFloat の to_i メソッドについて — Sako Hiroshi <sakoh@...2.so-net.ne.jp>
[#34989] mailing list archive? — maili31s@... (SugHimsi == SUGIHARA Hiroshi)
すぎむし。
[#34991] a = 4 ; p((a < 3) or (a > 5)) — Take_tk <ggb03124@...>
次のものがエラーになるのは何故なんでしょうか?
新井です。
たけ(tk)です。
まつもと ゆきひろです
newです.
[#35005] FILE_READPTR — Daisuke Aoki <dai@...>
青木@横浜です。
[#35028] win32.c 中の my* 関数について — 小西 弘将 <konishih@...6.so-net.ne.jp>
小西 弘将です。
なかだです。
小西 弘将です。
小西 弘将です。
こんにちは、なかむら(う)です。
なかだです。
小西 弘将です。
なかだです。
小西 弘将です。
小西 弘将です。
なかだです。
小西 弘将です。
なかだです。
[#35052] ruby_lib/html/ — Wakou Aoyama <wakou@...>
青山です。
まつもと ゆきひろです
にょにょると申します。(ここハンドル投稿ダメなのでしょうか?ダメなら本
青山です。
にょにょるです。オンラインではずっとこれを使っているので、これでいきま
青山です。
はじめまして。Siena. と申します。
青山です。
Siena.%なんだか毎度長いなぁ --; です。
[#35054] 「 Ruby/GTK プログラミング入門」 — Noritsugu Nakamura <nnakamur@...>
なかだです。
むとうです。
[#35058] Y Combinator — sinara@...
"Y Combinator" とは何かというと
続いて、ちょっと数学っぽい解釈をします。先の
At Sun, 12 May 2002 13:59:51 +0900,
At Sun, 12 May 2002 16:37:27 +0900,
[#35081] ISO 8601 と Time#wday — Take_tk <ggb03124@...>
Delphi の日付時刻ルーチンを Ruby にポートしようと思っているのですが、次
[#35087] Re: Y Combinator — 正木 功 <GEC01122@...>
正木です。
[#35102] ANNOUNCE: REXML のドキュメントの和訳を公開しました。 — Kouhei Sutou (須藤功平) <kou@...>
はじめまして、須藤です。
なひです。
須藤です。
なひです。
須藤です。
なかだです。
高橋征義です。
なひです。
なひです。
まつもと ゆきひろです
須藤です。
なひです。
Siena. です。
なひです。
[#35109] DOS プロンプトからリダイレクションつきの system — TOYOFUKU Chikanobu <toyofuku@...>
豊福です。
[#35113] Re: Marshallers summary — "NAKAMURA, Hiroshi" <nakahiro@...>
なかひろです。
[#35134] 朝、トーストを食べていると不意に — Shin-ichiro HARA <sinara@...>
「来年から Perl が高校の授業で必修になるってホント?」って
[#35207] tar.gz の展開 — "NAKANO Kouichi" <knuckle@...8.dion.ne.jp>
はじめまして、なかのともうします。
[#35215] ruby-shell-mode — "Shirai,Kaoru" <shirai@...1jp.com>
白井です。
[#35252] ((Time.now)..(Time.now+60)) — Take_tk <ggb03124@...>
たけ(tk)です。
[#35253] ((1.2)..(3.4)).to_a — Take_tk <ggb03124@...>
1.2..3.4 を配列にすると、その範囲に属しない整数「1」が含まれるという点に
まつもと ゆきひろです
たけ(tk)です。
Siena. です。
まつもと ゆきひろです
Siena. です。
青山です。
[#35264] HTML generation library — Wakou Aoyama <wakou@...>
青山です。
[ruby-list:35107] Re: ruby_lib/html/
はじめまして。Siena. と申します。
どうぞよろしくお願いします。
# どこに繋げたら良いのか迷いましたが、とりあえずこの辺りに
今回の分離で、HTML 生成部分がどの程度変更されるのかなど、
よく分かってないのですが、個人的に次のような事を思っていました。
* HTML 関連の様々な API があって、覚えにくいし、組み合わせて使いにくい
* 生成した HTML オブジェクトをいじるのは面倒そう
* XML API と同じインターフェイスで扱えると何かと便利そう
* Ruby での標準 XML API は REXML っぽい
という事で、REXML オブジェクト群を拡張して HTML 用の
メソッドを追加するというアプローチもあるかなぁ、と。
DOM Core と DOM HTML の関係のような感じですね。
XPath が使えたりと、オブジェクトをいじくるのは楽そうです。
ただ、REXML 自体がそう単純なライブラリというわけでも
ありませんから、どうしても軽量である事が重要といった
要求が強いのであれば、選択肢にはならないかもしれません。
また、実装モデルが従来のものと大きく変わってしまうので、
再実装の手間も大きいという問題もありますね。
ともかく雰囲気を見てみるため、例に挙げられていたくらいの
HTML 文書を生成できるものをでっちあげてみたりしていました。
ほんとに階層構造を作るだけでして、cgi.rb にあるような
便利なメソッドは一切用意していません。
# そのわりに、コードが長いような --;
》> ところで、かっこの閉じ忘れをRubyがチェックしてくれるのなら、ついでに子要
》> 素の制限(<body>要素内にインライン要素は配置できない、等)も(できればコ
》> ンパイル時に)チェックしてほしい、と言うのはちょっと酷でしょうか?これが
》これは私も思っていました。こんなのは面白いかなあ、と。
》
》html.p() do |html|
》 html.head(){} # NoMethodError
》end
ついでに、これもできるようにしてみたりしてみました。
チェックは文書要素の階層構造だけで、属性にまではしていません。
HTML 4.01 Strict DTD から、一通りの要素型の階層構造を定義して
しまいましたが、そこを簡略化したものを添付させていただきます。
とりあえず動くという程度で、まだまだ実用には程遠いですし、
コードもお世辞にもきれいとはいえないので恥ずかしいですが ^^;
add とか << とかも、見た目がすっきりするので使いたかったけれど、
REXML で定義済みで、その仕様の変更が必要になりそうなので諦めました。
テキスト追加の add_text は REXML のそれをそのまま使っています。
面白いところはないと思いますが、おかしなところなどは
たくさん ^^; あると思いますので、ご指摘いただければ幸いです。
えぇと。うちの動作確認環境は次の通り。
ruby 1.6.4 (2001-06-04) [i386-os2_emx]
REXML 2.1.3
# REXML を使う上での問題点は、文字列が UTF-8 か ASCII である事を
# 前提に造られている事ですね ...って、このコード、大丈夫かしら ^^;?
それでは、今後ともよろしくお願い致します ^^=
^--- testhtml.rb
#! ruby -Ks
require 'html'
include HTML
## おためし
encoding = 'Shift_JIS'
doc = HTML::Html4Strict.new( encoding )
doc.html do |html|
html.head() do |h|
h.meta( 'http-equiv' => 'Content-Type',
'content' => 'text/html;charset=%s' % encoding )
h.title( 'タイトル' ) ## {←内容テキスト,↑属性}だけを指定
# h.h1( 'えらー' ) ## 未定義
end
html.body do |b|
b.h1().em( '見出し' ) ## 内容が単一要素ならこんな略記もできる
b.p( '文章ですよぉ' ) ## 実は b.p{ |p| p.add_text( '...' ) } の略記
b.form do |f| ## ↓構造が複雑な時、テキストの指定が面倒かも
f.add_text( 'コメント: ' )
f.textarea( { 'name' => 'field_name' }, '何か書いてね' )
f.br() ## ↑属性と内容テキストの同時指定
f.button( 'type' => 'submit' )
end
b.br()
## ↓REXML API を直接使って標準的でない構造も作り込める
## いかにも非標準という感じのコードになる
r = b.add_element( 'ruby' )
r.add_element( 'rb' ).add_text( 'ルビ' )
r.add_element( 'rt' ).add_text( 'るび' )
b.add_text( 'とか振ってみる' )
end
end
puts doc
$--- testhtml.rb
^--- html/html.rb
#! ruby -Ks
require 'rexml/document'
require 'rexml/element'
require 'jcode'
module HTML
module NodeHelper
## REXML::Document.add_element をブロック付きで呼べるようオーバーライド
def add_element( elem = nil, attr = nil )
result = super( elem, attr )
yield( self ) if( block_given? )
result
end
## elemtype クラスの文書要素を自分の子に追加
def add_child_element( elemtype, attr = nil, &content )
e = elemtype.new( self, @context, &content )
add_element( e, attr )
end
end
## Element と Document にだけ、とりあえずな定義をしてみる
class Element < REXML::Element
include NodeHelper
end
class Document < REXML::Document
include NodeHelper
def self.html_param_entity()
@html_param_entity ||= Hash.new( [] )
end
def self.define_param_entity( name, *content_model )
name = name.id2name() if( name.instance_of? Symbol )
html_param_entity()[ name ] += content_model
end
def self.expand_content_model( *content_model )
result = []
content_model.each do |c|
c = c.id2name() if( c.instance_of? Symbol )
entity = html_param_entity()
if( entity.key? c )
result += expand_content_model( *entity[ c ] )
else
result << c
end
end
result
end
## 文書要素型クラスの定義
def self.define_element_type( name, *content_model )
name = name.id2name if( name.instance_of? Symbol )
## 子要素追加メソッドの定義
content_model = expand_content_model( *content_model )
content_model = content_model.collect{ |cont|
cont = cont.id2name if( cont.instance_of? Symbol )
<<-EOS
def #{cont}( attr = nil, text = nil, &content )
text, attr = attr, nil if( attr.instance_of? String )
e = add_child_element( #{cont.capitalize}, attr, &content )
e.add_text( text )
end
EOS
}
## クラス定義
module_eval <<-EOS
class #{name.capitalize} < Element
def initialize( parent = nil, ctxt = nil, &content )
super( "#{name}", parent, ctxt )
content.call( self ) if( content != nil )
end
#{content_model}
end
EOS
end
## 空文書要素型クラスの定義
def self.define_empty_element_type( name )
name = name.id2name if( name.instance_of? Symbol )
## クラス定義
module_eval <<-EOS
class #{name.capitalize} < Element
def initialize( parent = nil, ctxt = nil )
super( "#{name}", parent, ctxt )
end
## 終了タグを出力しないようにオーバーライド
def write( writer, indent = -1 )
indent( writer, indent )
writer << '<' << expanded_name()
@attributes.each_attribute do |attr|
writer << " "
attr.write( writer, indent )
end unless @attributes.empty?
writer << '>'
end
end
EOS
end
end
class Html4Strict < Document
## 文書要素型定義 (デモ用簡易版)
define_param_entity :inline, :em, :b ## <!ENTITY % inline "em|b"> 相当
define_element_type :em
define_element_type :b
define_element_type :p, :inline ## <!ELEMENT p - - (%inline;)> 相当
define_element_type :h1, :inline ## (終了タグは常に出力 ^^;)
define_empty_element_type :br ## <!ELEMENT br - O EMPTY> 相当
define_param_entity :formctrl, :button, :textarea
define_empty_element_type :button
define_element_type :textarea
define_element_type :form, :formctrl, :br
define_element_type :body, :h1, :p, :form, :br
define_empty_element_type :meta
define_element_type :title
define_element_type :head, :meta, :title
define_element_type :html, :head, :body
attr_accessor :html_encoding
def initialize( encoding = 'iso-8859-1' )
super()
@html_encoding = encoding
self << REXML::DocType.new( 'html', '"-//W3C//DTD HTML 4.01//EN"' \
+ ' "http://www.w3.org/TR/html4/strict.dtd"' )
end
def html( attr = nil, &content )
add_child_element( Html, attr, &content )
self
end
end
end ## module HTML
$--- html.rb