Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Sublime Text2 | テーブル構造の文字列をスペースパディングで整形するPlugin

概要

テーブル構造の文字列をスペースパディングで整形するPlugin

内容

テーブル構造の文字列をスペースパディングで整形するPluginを作成しました。
各種Wiki記法やMarkdown記法や、CucumberのDSL等で以下のような記述を利用することが多いと思います。

  |column1|coln2|c3|
   |v1|value2|val3|
   |value1|v2|value3|

ちなみに上記はわざと不揃いにしてありますが、実際は下記のようにしたい場合が多いと思います。

    |column1|coln2 |c3    |
    |v1     |value2|val3  |
    |value1 |v2    |value3|

そのような際にショートカット一発で変換できるPluginを作成しました。
キーバインドの指定時にセパレーターを指定出来るようにしてありますので、
パイプ以外の区切り文字にも対応可能です。

ソースコード

文字列整形処理

table_justifier.py

# -*- coding: utf-8 -*-

class TableJustifier:
  def justify(self, value, separator):
    rows = value.split("\n")

    separated_rows = self._get_separated_rows(value, separator)
    max_lens = self._get_max_lens(value, separator)
    justyfid_rows = self._get_justyfid_rows(separated_rows, max_lens, separator)
    return justyfid_rows

  def _get_separated_rows(self, value, separator):
    rows = value.split("\n")
    separated_rows = []
    for row_index, row in enumerate(rows):
      columns = row.split(separator)
      separated_rows.append(columns)
    return separated_rows

  def _get_max_lens(self, value, separator):
    max_lens= []
    rows = value.split("\n")
    for row_index, row in enumerate(rows):
      columns = row.split(separator)
      for column_index,column in enumerate(columns):
        if (column_index == len(columns) -1):
          break
        if row_index == 0:
          max_lens.append(len(column))
          continue
        if max_lens[column_index] < len(column):
          max_lens[column_index] = len(column)
    return max_lens

  def _get_justyfid_rows(self, separated_rows, max_lens, separator):
    justyfid_rows = []
    for separated_row in separated_rows:
      justyfid_columns = ""
      for separated_column_index,separated_column in enumerate(separated_row):
        if (separated_column_index == len(separated_row) -1):
          break
        justyfid_columns += separated_column.ljust(max_lens[separated_column_index])
        justyfid_columns += separator
      justyfid_rows.append(justyfid_columns)
    return "\n".join(justyfid_rows)
Sublime Text Plugin Commandからの呼び出し部

TableJustifierCommand.py

# -*- coding: utf-8 -*-
import sublime, sublime_plugin
from table_justifier import *
 
class TableJustifierCommand(sublime_plugin.TextCommand):
  def run(self, edit, **kwargs):
    if kwargs == None:
      kwargs["separator"] = "|"

    separator = kwargs["separator"]
    ret = ""
    region_of_line = ""
    for region in self.view.sel():
      region_of_line = self.view.line(region)

    justifier = TableJustifier()
    ret = justifier.justify(self.view.substr(region_of_line), separator)

    return self.view.replace(edit, region_of_line, ret)
設定

・table_justifier.pyを%Sublime Text 2%\Packages\Userにコピーします。
・TableJustifierCommand.pyを%Sublime Text 2%\Packages\Userにコピーします。
・Preference=>Key Bindings Userに下記を追加します。(Windowsの場合)

{ "keys": ["alt+shift+j"], "command": "table_justifier", "args": {"separator": "|" }}

"|"の部分を他のセパレータに返ることで任意の区切り文字に対応可能です。