2019-02-07
表参道.rb #43
うなすけ
【お知らせ】サードパーティesaツールに “HolyGrail/kibela2esa“ を追加しましたhttps://t.co/oWmdHuuhnXhttps://t.co/a5jGUIbngX
— esa_io (@esa_io) 2019年1月31日
kibelaの記事をesaに移行するscript
gemではないTEAM='unasuke'
TITLE_PATTERN = %r[\A.*/kibela-#{TEAM}-\d+/(?<kind>wikis|blogs)/(?<path>[[:print:]]*/)*(?<id>\d)+-(?<name>[[:print:]]*)\.md\z]
ATTACHMENT_PATTERN = %r[^(?~http)(\.\./)*attachments/(?<attachment_name>\d+\.(png|JPG|jpg|jpeg|gif|PNG))]
kibela.rb#L6-L7
ナニコレ???
みやすく改行してみましょう
TEAM='unasuke'
TITLE_PATTERN = %r[\A.*
/kibela-#{TEAM}-\d+
/(?<kind>wikis|blogs)
/(?<path>[[:print:]]*/)*
(?<id>\d)+-(?<name>[[:print:]]*)\.md\z]x
ATTACHMENT_PATTERN = %r[^(?~http)
(\.\./)*attachments/
(?<attachment_name>\d+\.
(png|JPG|jpg|jpeg|gif|PNG))
]x
雑に改行を入れましたが、これも正しい正規表現です
kibelaのexportされたデータを見てみましょう
あーなんとなくわかってきた
じゃあこれを正規表現にしていきましょう
TITLE_PATTERN = %r[
\A.* # 先頭に任意の文字列を許容
/kibela-#{TEAM}-\d+ # /kibela-team名-数値 にマッチ
/(wikis|blogs) # /wikis か /blogs にマッチ
/([[:print:]]*/)* # /任意の文字列 の0回以上の連続にマッチ
(\d)+-([[:print:]]*)\.md # 数値-任意の文字列.md にマッチ
\z # 文字列の末尾
]x
正規表現はできた……
ので、マッチした部分を取り出したい
丸括弧 ( ) によってキャプチャをすることができます。
1,2,... ではなく、名前を付けることができます。 (?<name>pat)もしくは(?'name'pat)と記述します。https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
TITLE_PATTERN = %r[\A.*
/kibela-#{TEAM}-\d+
/(?<kind>wikis|blogs)
/(?<path>[[:print:]]*/)*
(?<id>\d)+-(?<name>[[:print:]]*)\.md\z]x
regexp = TITLE_PATTERN.match(filepath)
regexp[:kind] # これでblogsなのかwikisなのかわかる
regexp[:path] # これで記事のカテゴリがわかる
regexp[:name] # これで記事の名前が取れる
ATTACHMENT_PATTERN = %r[^(?~http)
(\.\./)*attachments/
(?<attachment_name>\d+\.
(png|JPG|jpg|jpeg|gif|PNG))
]x
<img
title='foo'
src='../../../../attachments/6.png' # この'6.png'が欲しい
width="662"
data-meta='{"width":662,"height":195}'>
ちなみにこれはmarkdown内に書かれています
むしゃくしゃしてHTML tagを含むmarkdownをNokoginiに投げたらいい感じの結果が帰ってきて最高の気分
— うなすけ (@yu_suke1994) 2019年1月26日
(?~式) という記法で、式にマッチする文字列を含まない任意の文字列にマッチします。https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html
最高!!
ATTACHMENT_PATTERN = %r[
^ # 文字列の先頭
(?~http) # http で開始しない
(\.\./)*attachments/ # 任意の階層/attachmentsにマッチ
(?<attachment_name>\d+ # 画像名(数字)
\.(png|JPG|jpg|jpeg|gif|PNG)) # 画像名(拡張子)
]x