LoginSignup
7
7

More than 5 years have passed since last update.

インデントを使用したテキストをMarkdownにする

Last updated at Posted at 2014-04-21

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らしい書き方がわかっていない。
    ↑アドバイスお願いします。
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7