💀
HTML converter for 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(/&/, '&').gsub(/</, '<').gsub(/>/, '>')
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とします。
Discussion