Ruby初心者がPopClipのExtensionに挑戦してみました。
下記のようなテキストをMarkdownに変換します。
ファイルはhokupod/popclipに上げておきます。
サンプルテキスト
タイトル
見出し2
見出し2
リスト
リスト
リスト
見出し2
見出し3
リスト
リスト
出力結果
タイトル
========
## 見出し2
## 見出し2
- リスト
- リスト
- リスト
## 見出し2
### 見出し3
- リスト
- リスト
PopClipソース
txt2md.rb
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
$KCODE = 'u'
class Markdown
attr_reader :count
def initialize(text)
@indent = /\t|\s{4}/
# 日本語濁点対応
@text = text.gsub(@indent, '')
.tr("\u309B\u309C", "\u3099\u309A")
.encode('UTF-8', 'UTF-8-MAC')
@count = text.scan(@indent).size
end
def title
"#{@text}\n========\n"
end
def heading
"#{'#' * (@count + 1)} #{@text}"
end
def list
"- #{@text}\n\n"
end
def list_last
"- #{@text}"
end
end
# ENV['POPCLIP_TEXT'] <= ここに選択したテキストが格納し配列に変換
text_in = ENV['POPCLIP_TEXT'].to_s.split("\n")
# Markdownのスタイルを判定するための正規表現
heading_prefix = /^#.*/
list_prefix = /^-\s/
write_text = []
before_style = 0
before_text = ''
i = 0
# 配列を逆から回してスタイルを判定
text_in.reverse_each do |paragraph|
md = Markdown.new(paragraph)
heading_check = before_text.scan(heading_prefix).size
list_check = before_text.scan(list_prefix).size
# Markdownのスタイルを判定し配列に格納
if md.count == 0
write_text << md.title
elsif before_style < md.count && list_check == 0
write_text << md.list
elsif before_style <= md.count && list_check != 0 && heading_check == 0
write_text << md.list_last
else
write_text << md.heading
end
# 一つ前のスタイル情報を格納
before_style = md.count
before_text = write_text.last
i += 1
end
# 整形済みテキストをアウトプット
write_text.reverse_each do |md|
puts md
end
課題
- 複数行の要素に対応していない。
- Rubyらしい書き方がわかっていない。
↑アドバイスお願いします。