💀

HTML converter for flay

2024/08/16に公開

https://github.com/seattlerb/flay

flayの結果をHTMLで見るツールを雑に書いてみた。

flayの結果はテキストファイルで出力されるのみで、結果を眺めるにはわりと不便だったため。
(あとから metric_fu gem のようなツールがあることを思い出したけれど、今回欲しかったのはflayの結果だけだったので、ミニマムに済ませられたからいいや)

書いたコード

# flay_html.rb
def indent_of(line)
  line[/^\s*/].size
end

def cut(lines, lnum)
  ret = []
  indent = indent_of lines[lnum-1]
  ret << lines[lnum-1]
  i = lnum
  while i < lines.size && (indent_of(lines[i]) > indent || lines[i].match?(/^\s*$/))
    ret << lines[i]
    i += 1
  end
  ret << lines[i] if i < lines.size

  ret.join
end

def rough_html_escape(str)
  str.gsub(/&/, '&amp;').gsub(/</, '&lt;').gsub(/>/, '&gt;')
end

ARGF.each_line(chomp: true) do |line|
  case line
  when /^\d+/
    puts "<h3>#{line}</h3>"
  when /^  \S/
    # read the file
    path, lnum = line.lstrip.split(':')
    lines = File.read(path).lines
    content = rough_html_escape cut(lines, lnum.to_i)
    puts <<~HTML
      <details>
      <summary>#{line}</summary>
      <pre><code>#{content}</code></pre>
      </details>
    HTML
    puts "<br>"
  when ''
    puts "<hr>"
  else
    puts "<h1>#{line}</h1>"
  end
end
$ flay app/**/*.rb > flay_result
$ ruby flay_html.rb flay_result > flay.html

これで簡素なHTMLが出力される。検出されたコードも<details>タグを使って出力しているので、ポチポチしていけばコードを見ながら検出結果を眺められて便利。

とりあえず動けばよいので、見た目やXSS対策などは気にしていない。

実行結果

実際に適当なRubyコード(ruby/rbs)で動かした結果が以下。

テキスト形式のオリジナルの出力

Total score (lower is better) = 7795

1) IDENTICAL code found in :if (mass*2 = 324)
  lib/rbs/prototype/runtime.rb:339
  lib/rbs/prototype/runtime.rb:379

(snip)

HTMLに変換した結果

重複コードの探索がまあまあ捗った。


記事中のコードのライセンスはCC-0とします。

Money Forward Developers

Discussion