Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

studistory | イテレーション2 | TODO終了用Subiime Text2 Plugin

概要

TODO終了用Subiime Text2 Plugin

内容

TODO終了用Subiime Text2 Pluginを作成します。

仕様

下記フォーマットの作業開始済みTODOがあったとして、終了Pluginを実行すると

- title,summary,estimate,2013/09/15 23:45:46,,

下記のようになる。

- title,summary,estimate,2013/09/15 23:45:46,2013/09/15 23:48:59,

ソースコード

Sublime Text2から呼び出すPlugin
EndTodoCommand.py

# -*- coding: utf-8 -*-
import sublime, sublime_plugin
from todo_calculator import *
 
class EndTodoCommand(sublime_plugin.TextCommand):
  def run(self, edit):
    ret = ""
    region_of_line = ""
    for region in self.view.sel():
      region_of_line = self.view.line(region)

    todo = TodoCalculator(self.view.substr(region_of_line))
    todo.set_to_date()

    ret  = todo.get_columns()
    ret_str = "  - " + ",".join(ret)

    return self.view.replace(edit, region_of_line, ret_str)

EndTodoCommand.pyから呼び出すTODO汎用処理
TodoCalculator.py

# -*- coding: utf-8 -*-
import datetime
import time
import re

class TodoCalculator:
  def __init__(self, todo):
    self.todo = re.sub(r'^.*- ', '', todo)
    self.columns = self.todo.split(",")

  # yyyy/mm/dd hh:mi:ss形式の文字列からdatetimeを取得
  def get_datetime(self, date_text):
    return datetime.datetime(*time.strptime(date_text,'%Y/%m/%d %H:%M:%S')[:6])

  # 1行のTODOをカラムリストに分割
  def get_columns(self):
    return self.columns

  # 差分時間の取得
  def get_diff_date(self):
    return self.columns[self.DIFF_DATE_INDEX]

  def set_start_date(self):
    columns = self.get_columns()
    self.columns[self.FROM_DATE_INDEX] = self.get_formated_current_date()

  def set_to_date(self):
    columns = self.get_columns()
    self.columns[self.TO_DATE_INDEX] = self.get_formated_current_date()

  def diff_date(self):
    columns = self.get_columns()
    datetime_from = self.get_datetime(self.get_from_date())
    datetime_to = self.get_datetime(self.get_to_date())

    datetime_diff  = datetime_to - datetime_from
    self.columns[self.DIFF_DATE_INDEX] = str(datetime_diff)

  def get_formated_current_date(self):
    date = datetime.datetime.today()
    formated_date =  '%04d/%02d/%02d %02d:%02d:%02d' % (date.year, date.month, date.day, date.hour, date.minute, date.second)
    return str(formated_date)

KEYS = ["title", "summary", "estimate", "from_date", "to_date", "diff_date"]

for column in KEYS:
  def _column(self, index=KEYS.index(column)):
    return self.columns[index]
  # get_xxxメソッドの追加
  setattr(TodoCalculator, "get_" + column, _column)
  # XXX定数の追加
  setattr(TodoCalculator, column.upper() + "_INDEX", KEYS.index(column))

date_keys = ["from_date", "to_date"]
for date in date_keys:
  def _set_now(self, index=KEYS.index(date)):
    self.columns[index] = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")

  # get_xxxメソッドの追加
  setattr(TodoCalculator, "set_now_" + date, _set_now)