ブログ

読んで思い出す。忘れるために書く

Q. Markdown のリンク リストをタイトルの短い順に並べ替えしたい

A. Nokogirigithub/markup, それと sort_by を使う

手順とコード

手順

大まかな手順としては:

  • markup に Markdown を解析させて HTML に変換
  • Nokogiri でHTML 中から <a/> タグを抽出
  • <a/> タグのタイトル部分とURL 部分を抽出
  • <a/> タグのタイトル部分の長さをもとに並べ替え
  • タイトル, URL の文字列を組み立てて Markdown 形式のテキストに戻す

コード

require 'nokogiri'
require 'github/markup'

markdown_links =<<EOF
* [Class: Object#tap (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Object.html#method-i-tap)
* [Class: Array#map (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Array.html#method-i-map)
* [Nokogiri](https://nokogiri.org/)
* [github/markup: Determines which markup library to use to render a content file (e.g. README) on GitHub - GitHub](https://github.com/github/markup)
* [Module: Enumerable#sort_by (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Enumerable.html#method-i-sort_by)
EOF

rendered_html_string = GitHub::Markup.render('foo.md', markdown_links)

puts Nokogiri::HTML(rendered_html_string).search('a')
  .sort_by { |a| a.text.length }
  .map { |a| { title: a.text, url: a.attribute('href').value } }
  .tap { |hash_array| p hash_array.first } # for debug
  .map { |link| "* [#{link[:title]}](#{link[:url]})" }
# =>
# {:title=>"Nokogiri", :url=>"https://nokogiri.org/"}
# * [Nokogiri](https://nokogiri.org/)
# * [Class: Array#map (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Array.html#method-i-map)
# * [Class: Object#tap (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Object.html#method-i-tap)
# * [Module: Enumerable#sort_by (Ruby 2.6.3)](http://ruby-doc.org/core-2.6.3/Enumerable.html#method-i-sort_by)
# * [github/markup: Determines which markup library to use to render a content file (e.g. README) on GitHub - GitHub](https://github.com/github/markup)

Links