<![CDATA[
こちらのエントリーにある問題について考えてみました。簡単に言うと以下の2点です。
(1)「○○氏に電話する」というようなありがちなタスク名の場合、既存タスクと名前がかぶることが多く、その都度ユニークなタスク名を考えて入力しなおすのが面倒
(2)todoマクロを使って一括登録する場合、タスク名がかぶっていると登録されない
TiddlyWikiでは、記事タイトルはデータベースでいうところの主キーにあたるためユニークでなければなりません。したがってこの前提をくつがえすような改造はかなり大掛かりになる上に、今後TiddlyWikiのバージョンアップに対応できない可能性が高くなってしまいます。
そこで現実的な対応方法として、以下の方針で考えてみました。
(1)への対応
・既存タスクと同名の場合、末尾に連番を付加してユニークな名前にする
(2)への対応
・「プロジェクト」タグがついている記事でtodoマクロを使った場合
各タスクの先頭にプロジェクト名を付加する
・先頭にプロジェクト名をつけても既存タスクとかぶる場合、末尾に連番を付加する
本機能を次のバージョンアップ内容に含めるかどうかは未定です。(1)は本来のTiddlyWikiの挙動とことなってしまうのであまり入れたくないですが、(2)の前半は入れてもいいかも。
導入方法:
GTDStyleWikiで以下の内容の新規記事を作成し、保存、リロード
タイトル:任意(ただしGtdTodoMacroよりもソート順で後になること)
タグ:systemConfig
本文:以下の内容をペースト
//{{{
Story.prototype.saveTiddler = function(title,minorUpdate)
{
var tiddler = document.getElementById(this.idPrefix + title);
if(tiddler != null)
{
var fields = {};
this.gatherSaveFields(tiddler,fields);
var newTitle = fields.title ? fields.title : title;
if(store.tiddlerExists(newTitle) && newTitle != title)
{
// 2006.09.22 ------------
var n = 1;
var tmpTitle = newTitle;
while (store.tiddlerExists(tmpTitle)) {
tmpTitle = newTitle + "_" + n;
n++;
}
newTitle = tmpTitle;
// -----------------------
}
tiddler.id = this.idPrefix + newTitle;
tiddler.setAttribute("tiddler",newTitle);
tiddler.setAttribute("dirty","false");
if(config.options.chkForceMinorUpdate)
minorUpdate = !minorUpdate;
var newDate = new Date();
store.saveTiddler(title,newTitle,fields.text,
config.options.txtUserName,
minorUpdate ? undefined : newDate,
fields.tags);
if(config.options.chkAutoSave)
saveChanges();
return newTitle;
}
return null;
}
config.macros.todo.onClick = function()
{
var m = config.macros.todo;
if (!confirm(m.alert))
return false;
var title = this.getAttribute("tiddler");
if (title == "") {
return false;
}
// 2006.09.22 --------------
var isProject = store.getTiddler(title).
isTagged("プロジェクト") ? true : false;
// -------------------------
var text = store.getTiddlerText(title);
while (text.match(/<<[^>]*>>/) != null)
text = text.replace(/<<[^>]*>>/, "");
while (text.match(/\/%[^%]*%\//) != null)
text = text.replace(/\/%[^%]*%\//, "");
while (text.match(/%[%\$] ?/) != null)
text = text.replace(/%[%\$] ?/, "");
while (text.match(/\[\[|\]\]/) != null)
text = text.replace(/\[\[|\]\]/, "");
list = text.split("\n");
var cnt = 0;
for (var i = 0; i < list.length; i++) {
var s = list[i];
var indent = "";
if (s.match(/^((\s| )+)/))
indent = RegExp.$1;
s = s.replace(/^(\s| )+/,"");
s = s.replace(/(\s| )+$/,"");
if (s == "")
continue;
// 2006.09.22 --------------
if (isProject)
s = title + ": " + s;
var n = 1;
var tmpTitle = s;
while (store.tiddlerExists(tmpTitle)) {
tmpTitle = s + "_" + n;
n++;
}
s = tmpTitle;
// -------------------------
list[i] = indent + "%% [[" + s + "]]";
cnt += m.createTiddler(s);
}
var tiddler = store.createTiddler(title);
tiddler.set(title, list.join("\n"));
refreshDisplay();
story.refreshTiddler(title, DEFAULT_VIEW_TEMPLATE, true);
alert(m.message.replace(/%0/, String(cnt)));
return false;
}
//}}}
]]><![CDATA[
]]>