Project

General

Profile

Actions

Bug #3360

closed

rdoc fails when including BOM

Added by whiteleaf (whiteleaf _) almost 14 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.3dev (2010-05-28 trunk 28052) [i386-cygwin]
Backport:
[ruby-dev:41452]

Description

=begin
whiteleaf と申します。

BOM を含むファイルを rdoc にかけると処理が固まります。
rdoc が BOM を見てないせいなので、以下のパッチでなおりました。

・":bom|utf-8" オプションを使っていないのは 1.8 のためと
 結局 ASCII-8BIT に force_encoding しないといけないため意味がないからです。
 (rdoc のエンコーディングを UTF-8 にするなら別ですが)
・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
 ので意味がないからです。
・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
 charset とエンコーディングが異なる可能性があるためです。

余談ですが、bom|utf-* オプションはエンコーディングが未知の場合には

ほとんど意味が無いなあと思いました。

Index: generator/template/darkfish/classpage.rhtml

--- generator/template/darkfish/classpage.rhtml (リビジョン 28052)
+++ generator/template/darkfish/classpage.rhtml (作業コピー)
@@ -1,4 +1,4 @@
-
+"?>

Index: rdoc.rb =================================================================== --- rdoc.rb (リビジョン 28052) +++ rdoc.rb (作業コピー) @@ -404,12 +404,17 @@ end
def read_file_contents(filename)
  • utf8_bom = [0xEF, 0xBB, 0xBF].pack("C*")
    content = open filename, "rb" do |f| f.read end

  • if content[0..2] == utf8_bom then

  •  content = content[3..-1]
    
  • end
    if defined? Encoding then
    if /coding[=:]\s*([^\s;]+)/i =~ content[%r"\A(?:#!.\n)?.\n"]
    if enc = ::Encoding.find($1)
    content.force_encoding(enc)

  •      content.encode!(@options.charset)
       end
     end
    

    end
    =end

Actions #1

Updated by mame (Yusuke Endoh) almost 14 years ago

=begin
遠藤です。

2010年5月29日2:17 white leaf :

BOM を含むファイルを rdoc にかけると処理が固まります。
rdoc が BOM を見てないせいなので、以下のパッチでなおりました。

ありがとうございます。
再現しました。また、頂いたパッチで直ることを確認しました。

・":bom|utf-8" オプションを使っていないのは 1.8 のためと
結局 ASCII-8BIT に force_encoding しないといけないため意味がないからです。
(rdoc のエンコーディングを UTF-8 にするなら別ですが)
・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
ので意味がないからです。
・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
charset とエンコーディングが異なる可能性があるためです。

要するに、このパッチは 2 つの問題を修正していますよね。

  • BOM があるとパースが固まる
  • html 出力の charset 指定が無視されている

成瀬さん、M17N 関係なのでパッチが正しいか見ていただけますか。
正しいようなら Eric に転送します。

チケットを翻訳してくれる人はいないかなあ……。

--
Yusuke Endoh

=end

Actions #2

Updated by nobu (Nobuyoshi Nakada) almost 14 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r28062.
white, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Actions #3

Updated by mame (Yusuke Endoh) almost 14 years ago

=begin
遠藤です。

2010年5月29日12:07 Nobuyoshi Nakada :

This issue was solved with changeset r28062.

Eric を通さずに直していただいてしまったようですが、「html 出力の
charset 指定が無視されている」の方も直していただけますでしょうか。

diff --git a/lib/rdoc/generator/template/darkfish/index.rhtml
b/lib/rdoc/generator/template/darkfish/index.rhtml
index e853235..8dad4f4 100644
--- a/lib/rdoc/generator/template/darkfish/index.rhtml
+++ b/lib/rdoc/generator/template/darkfish/index.rhtml
@@ -1,4 +1,4 @@
-
+"?>

diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb
index 3c08b5e..7f41163 100644
--- a/lib/rdoc/rdoc.rb
+++ b/lib/rdoc/rdoc.rb
@@ -414,6 +414,7 @@ The internal error was:
if enc ||= (Encoding::UTF_8 if utf8)
content.force_encoding(enc)
end

  •  content.encode!(@options.charset)
    

    end

    content

--
Yusuke Endoh

=end

Actions #4

Updated by whiteleaf (whiteleaf _) almost 14 years ago

=begin
whiteleaf です。

--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。

それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)

=end

Actions #5

Updated by nobu (Nobuyoshi Nakada) almost 14 years ago

=begin
なかだです。

At Sun, 30 May 2010 00:36:49 +0900,
whiteleaf wrote in [ruby-dev:41460]:

--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。

そのへんが確信がなかったこともあり、別のissueと考えてそのままに
しました。

それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)

BOMもmagic commentもない場合は、US-ASCIIとして処理すべきでしょう。


diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb
index 3c08b5e..d605a26 100644
--- a/lib/rdoc/rdoc.rb
+++ b/lib/rdoc/rdoc.rb
@@ -411,9 +411,8 @@ The internal error was:
if /coding[=:]\s*([^\s;]+)/i =~ content[%r"\A(?:#!.\n)?.\n"]
enc = ::Encoding.find($1)
end

  •  if enc ||= (Encoding::UTF_8 if utf8)
    
  •    content.force_encoding(enc)
    
  •  end
    
  •  enc ||= (utf8 ? Encoding::UTF_8 : Encoding::US_ASCII)
    
  •  content.encode!(@options.charset, enc)
    

    end

    content

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

Actions #6

Updated by naruse (Yui NARUSE) almost 14 years ago

=begin
成瀬です。

(2010/05/29 2:17), white leaf wrote:

・UTF-8 の BOM しか見ていないのは ruby スクリプトに使わない(使えない)
 ので意味がないからです。

rdoc の書かれているファイルが ruby スクリプトだとは限らなかったような。

・encode してるのは複数のファイルが異なるエンコーディングを使っている場合に
 charset とエンコーディングが異なる可能性があるためです。

これができてないのは現状の仕様だったと思います。
なので、この部分は feature ですね。

余談ですが、bom|utf-* オプションはエンコーディングが未知の場合には

ほとんど意味が無いなあと思いました。

エンコーディングが未知な場合のための物では無いので当然です。

--
NARUSE, Yui

=end

Actions #7

Updated by naruse (Yui NARUSE) almost 14 years ago

=begin
成瀬です。

(2010/05/30 1:11), Nobuyoshi Nakada wrote:

At Sun, 30 May 2010 00:36:49 +0900,
whiteleaf wrote in [ruby-dev:41460]:

--charset オプションは「html の charset を指定する」という解釈ですと、
encode しないほうが正しい挙動といえなくもないですが、やっぱり
2つ以上の異なるエンコーディングのファイルを対象にする場合は
charset と中身のエンコーディングは揃えてほしいところです。

そのへんが確信がなかったこともあり、別のissueと考えてそのままに
しました。

そろえて欲しいという動機は理解できます。

HTML の charset と、Ruby での encoding が一致するとは限らないんですよね。
cf. Windows-31J, CP51932, Windows-1252

それと遠藤さんのパッチですと、
ASCII-8BIT のデータを encode してしまう可能性がある(Encoding::UndefinedConversionError)
ので、force_encoding をした場合のみ encode するべきです。
(私のパッチではそう処理していたはずです)

BOMもmagic commentもない場合は、US-ASCIIとして処理すべきでしょう。

rdoc が書かれているのが ruby スクリプトならばそれは US-ASCII のはずです。
が、それを UTF-8 として扱っても別に支障はありません。

rdoc が書かれているのが rdoc 専用ファイルだったり、別の何かへの埋め込みデータの場合、
それは rdoc やそのフォーマットの事情に依存します。それは Ruby M17N の判断する事柄では
ありません。それらが UTF-8 であるべきだと判断するならばこれも問題ありません。

--
NARUSE, Yui

=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0