Skip to content

Instantly share code, notes, and snippets.

@yoshihara
Created May 18, 2013 18:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yoshihara/5605300 to your computer and use it in GitHub Desktop.
Save yoshihara/5605300 to your computer and use it in GitHub Desktop.
Nozbeのタスクをwebでエクスポートしたテキストを、toodledoにimportするためにCSVに変換するスクリプト。まだ作りかけ。TODOはコード中に書いた。 たくさんひどいので、あとから修正したい。あとStringScannerを使ってみたくて使ったら盛大に失敗した気がする。 プロジェクトはフォルダとして、コンテキストはすべて別個のタグとして登録。日時はすべて締切り(duedate, duetime)として登録。プロジェクトごとのノートなど、toodledoにないものは省いた。
# -*- coding: utf-8 -*-
# TODO: 繰り返し(repeat)とかかる時間(length)をtoodledoが受け取れる時間に置き換える
# TODO: argumentsをハッシュでなくてクラスにする。to_aするときに↑のTODOや今duedateとかにやってる置換をするようにする
# TODO: fold long lines
# TODO: s = StringScanner.new(nozbe) のsをもっといい名前に
# TODO: add_rowでコメントまわりも面倒みる
require "strscan"
require "csv"
def add_row(csv, arguments)
return nil if arguments.nil? or arguments.empty?
task = arguments[:task]
folder = arguments[:folder]
duedate = arguments[:duedate]
duetime = arguments[:duetime]
repeat = arguments[:repeat]
length = arguments[:length]
tag = arguments[:tag]
star = arguments[:star]
note = arguments[:note]
duedate = duedate.gsub(/[年月]/, "/").gsub(/日/, "") if duedate
note = note.gsub(/\n/, "\r") if note
csv << [task, folder, nil, nil, nil, nil, nil, duedate, duetime, repeat, length, nil, nil, tag, nil, star, note]
end
def generate_tag(tags)
return nil unless tags
tags.split(" @").join(", ")
end
nozbe = File.read("nozbe.txt")
s = StringScanner.new(nozbe)
arguments = {}
note = ""
CSV.generate("", {encoding:"UTF-8", headers:true, force_quotes:true}) do |toodledo|
toodledo << ["TASK","FOLDER","CONTEXT","GOAL","LOCATION","STARTDATE","STARTTIME","DUEDATE","DUETIME","REPEAT","LENGTH","TIMER","PRIORITY","TAG","STATUS","STAR","NOTE"]
while not s.eos?
case
when s.scan(/^\* (.+?)( on (\d{4}年\d\d?月\d\d?日))?( (\d\d:\d\d))?( \^(.+?))?( %(.+?))?( #(.+?))?( @(.+?))? ?(!?)$/)
unless arguments.empty?
arguments = arguments.merge(note: note)
add_row(toodledo, arguments)
note = ""
end
tags = generate_tag(s[13])
arguments = {
task: s[1],
duedate: s[3],
duetime: s[5],
repeat: s[7],
length: s[9],
folder: s[11],
tag: tags
}
arguments = arguments.merge(star: "1") if s[14] == "!"
when s.scan(/^\{(.+?)\}$/m)
note << s[1]
else
s.pos += 1
end
end
unless arguments.empty?
arguments = arguments.merge(note: note)
add_row(toodledo, arguments)
end
File.open("toodledo_#{Time.now.strftime("%Y%m%d")}.csv", "w") do |file|
file.puts(toodledo.string)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment