Created
May 18, 2013 18:02
-
-
Save yoshihara/5605300 to your computer and use it in GitHub Desktop.
Nozbeのタスクをwebでエクスポートしたテキストを、toodledoにimportするためにCSVに変換するスクリプト。まだ作りかけ。TODOはコード中に書いた。
たくさんひどいので、あとから修正したい。あとStringScannerを使ってみたくて使ったら盛大に失敗した気がする。
プロジェクトはフォルダとして、コンテキストはすべて別個のタグとして登録。日時はすべて締切り(duedate, duetime)として登録。プロジェクトごとのノートなど、toodledoにないものは省いた。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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