A. Nokogiri と github/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)