スポンサードリンク

2006年09月23日

GTD Style Wiki Tips: タスク名の重複を回避する

O'REILLY風
こちらのエントリーにある問題について考えてみました。簡単に言うと以下の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;
}
//}}}

posted by style at 01:16 | Comment(25) | TrackBack(2) | GTDStyleWiki

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。