独学でRubyを勉強しているものです。
少し面倒くさいと思われる質問です。
おもしろいと思われた方、おつきあい願えたらと思います。
textファイルを、htmlに変換する簡単なスクリプトを書いていたのですが、書いていると欲が出て来て、
見出しの記述 = マークは<h1></h1>、 == で<h2></h2>、(以降、====== <h6></h6>まであり)、に変換
と、
文字の装飾の記述 +word+ で太字、word で斜体、+word+ でタイプ体に変換
くらいだけも、RDocのマークアップを取り入れられたらと思うようになりました。
Ruby
1original_text_file_name = File.basename($*[0]) #変換したい元のファイル名 2original_file_extension_name = File.extname($*[0]) #変換したい元のファイルの拡張子 3 4puts "実行中のRubyのスクリプトファイル:#{$0}" 5puts "変換するファイル:#{original_text_file_name}" 6puts "検出された拡張子:#{original_file_extension_name}" 7 8if original_file_extension_name == '' #もし拡張子がなければ、 9 html_file_name = original_text_file_name.concat('.html') #ただ単に`.html'を追加 10else 11 html_file_name = original_text_file_name.sub(original_file_extension_name, '.html') #拡張子を`html'に変換 12end 13 14begin 15 puts "これらから #{html_file_name} を生成します。。" 16 17 original_file = $*[0] 18 19 20File.open(original_file) do |text| 21 text.each_line do |line| 22#汎用変換エリア 23 line.gsub!(/&/, '&') 24 line.gsub!(/</, '<') 25 line.gsub!(/>/, '>') 26 line.gsub!(/"/, '"') 27 line.gsub!(/\//, '⁄') 28 line.gsub!(/¥/, '¥') 29 #line.gsub!(/\\/, '\') 30 line.gsub!(/#/, '#') 31 line.gsub!(/\n/, '<br>') 32 line.gsub!(/\s/, ' ') 33 line.gsub!(/\t/, ' ') 34 #line.gsub!(/\bruby\b/i, "<b>#{$&}</b>") 35#RDOC見出し変換エリア 36 if line =~ /^={6}/ then 37 line.sub!(/^={6}/, '<h6>').sub!(/<br>/, '</h6>') 38 elsif line =~ /^={5}/ then 39 line.sub!(/^={5}/, '<h5>').sub!(/<br>/, '</h5>') 40 elsif line =~ /^={4}/ then 41 line.sub!(/^={4}/, '<h4>').sub!(/<br>/, '</h4>') 42 elsif line =~ /^={3}/ then 43 line.sub!(/^={3}/, '<h3>').sub!(/<br>/, '</h3>') 44 elsif line =~ /^={2}/ then 45 line.sub!(/^={2}/, '<h2>').sub!(/<br>/, '</h2>') 46 elsif line =~ /^={1}/ then 47 line.sub!(/^={1}/, '<h1>').sub!(/<br>/, '</h1>') 48 end 49#RDOCリスト変換エリア 50 if line =~ /^\*/ then 51 line.sub!(/\*( )*/, '<li>').sub!(/<br>/, '</li>') 52 elsif line =~ /^-/ then 53 line.sub!(/\-( )*/, '<li>').sub!(/<br>/, '</li>') 54 end 55#RDOC装飾変換エリア 56 line.sub!(/\*((.+?)[^,|( )])\*/, "<b>#{$1}</b>") if line =~ /\*((.+?)[^,|( )])\*/ 57 line.sub!(/\_((.+?)[^,|( )])\_/, "<em>#{$1}</em>") if line =~ /\_((.+?)[^,|( )])\_/ 58 line.sub!(/\+((.+?)[^,|( )])\+/, "<tt>#{$1}</tt>") if line =~ /\+((.+?)[^,|( )])\+/ 59 60 File.open(html_file_name, 'a') do |html| 61 html.puts(line) 62 end 63 end 64end 65rescue => e 66 puts "エラーが発生しました。" 67 puts "エラー内容:#{e.message}" 68ensure 69 puts "プログラムを終了します。" 70end 71
でも、こんなんじゃ、うまく動かないことがわかりました。
どうも、元々のファイルの読み方自体がなってないようです。
each_lineで一行ずつ扱うと、一行に、+word+ が2回あったりすると、$1などの組込変数に最初の1つしか格納されないからです。
そこで、ああ、いいお手本があるじゃないかと思い付き、RDocのソースコードを参考にしようと一通り目を通しました。
ところが、なさけないことに、ソースコードを追いかけてみましたが、わからずじまいでした。。
https://github.com/ruby/rdoc/blob/master/lib/rdoc/rdoc.rb
今まで、テキストなどでは、
filename = ARGV[0]
file = File.open(filename)
text = file.read
text.each_line do |line|
やりたい処理
end
みたいなやり方しか見たことがなく、他のファイルの読み込み方を知りません。
そしてRDocのソースコード中にこんな感じの記述を見つけられないのでした。。
レベルが低くて誠にすみませんが、このRDocは一体、どこで、どのように、指定されたファイルを読み込んでいるのでしょうか?
教えていただけたら嬉しいです!
また、記載したコードにについてダメなところを教えて頂けたらと思います。
面倒くさい質問だと思いますがよろしくお願い申し上げます!
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/29 00:04