Hi JasonM

That sounds marvelous  could you please provide a live example ? ( -
or a Github sample)
Automatic wrapping of text in google groups makes it impossible to
copy/paste longer bits of code...

Cheers Måns Mårtensson

On 25 Sep., 09:43, JasonM <[email protected]> wrote:
> Hi, I have added two features to the TaskTimerPlugin.
>
> *Button Styling*
> I have added config.macros.taskTimer.class to allow a class name to be
> specified for the input button.
> When using the specified class name the plugin appends "_TimerOn" or
> "_TimerOff" depending on the status of the timer.
> This can be used to apply state relevant CSS styles to the timer
> buttons.
>
> For example,
> Tiddler - TaskTimerPluginConfig add,
>
> ---
> //  e.g. class="TaskTimer_TimerOn".  Use this in congunction with a
> style to change the look of the timer button.
> config.macros.taskTimer.class="TaskTimer";
> ---
>
> In an active stylesheet add:
> ---
> .TaskTimer_TimerOff {
> background-color:none;}
>
> .TaskTimer_TimerOn {
> background-color:lightgreen;}
>
> ---
> this will turn the button light green when the timer is running.
>
> *Field parsing in record format*
> You can now place in the format string a Field value from any
> tiddler.  The field is retrieved just before the record is written.
> For example,
> <<taskTimer today:YYYY-wWW "|%4|[[billCode@Client Project Alpha]] |%0|
> %1|%2|%3|\n" "Activity: " " " | ">>
>
> This useful when used in conjunction with the ListBoxPlugin.  Two
> scenarios in particular,
> 1. You need change a part of the format on a active timer without
> stopping it.
> 2. Your timers are all defined in a infrequently refreshed tiddler
> (e.g. MainMenu) and you require the ability to change the format
> without reloading all the time.
>
> Code below has only been tested on Firefox 6.0.2, Fedora 15 Linux
> 6.2.40.4
>
> @Eric - If you think this might be useful to others and it is suitable
> for inclusion into your main plugin please feel free to merge the
> changes.
>
> --- code start ---
> /***
> |Name|TaskTimerPlugin|
> |Source|http://www.TiddlyTools.com/#TaskTimerPlugin|
> |Documentation|http://www.TiddlyTools.com/#TaskTimerPluginInfo|
> |Version|1.4.2|
> |Author|Eric Shulman - ELS Design Studios|
> |License|http://www.TiddlyTools.com/#LegalStatements<br>and
> [[Creative Commons Attribution-ShareAlike 2.5 License|http://
> creativecommons.org/licenses/by-sa/2.5/]]|
> |~CoreVersion|2.1|
> |Type|plugin|
> |Requires||
> |Overrides||
> |Options|##Configuration|
> |Description|'timer' button automatically writes start/end/elapsed
> time into tiddler content|
> Quickly generate 'timed task' logs that can be used for status
> reports, billing purposes, etc.
> !!!!!Documentation> see [[TaskTimerPluginInfo]]
> !!!!!Configuration
> > see [[TaskTimerPluginConfig]]
>
> !!!!!Revisions
> <<<
> 2011.09.25 [1.4.2] jm - Added ability to style the button. Added field
> (format {{{field@tiddler}}} or {{{[[field@tiddler with more
> words]]}}} ) parsing in the record format.
> 2008.11.10 [1.4.1] in elapsed time calculation, truncate start/stop
> times to nearest second (avoids 1-second 'round-down' error)
> |please see [[TaskTimerPluginInfo]] for additional revision details|
> 2007.03.14 [0.5.0] converted from inline script
> <<<
> !!!!!Code
> ***/
> //{{{
> version.extensions.TaskTimerPlugin= {major: 1, minor:4, revision: 1,
> date: new Date(2008,11,10)};
>
> config.macros.taskTimer = {
>         label: "start timer",
>         title: "press to start the task timer",
>         format: "|%4|%0|%1|%2|%3|\\n", // note: double-backslash-en, also
> date is %4 (for backward compatibility)
>         defText: " ", // default description text
>         todayKeyword: "today",
>         todayFormat: "0MM/0DD/YYYY", // default format - superceded by
> CalendarPlugin, DatePlugin, or DatePluginConfig
>         datestampFormat: "YYYY-0MM-0DD", // date stamp format
>         buttonFormat: "%0 - %2",  // timer button formats: %0=current time,
> %1=start time, %2=elapsed time
>         defHeader: "|//Date//|//Description//|//Started//|//Stopped//|//
> Elapsed//|\n",
>         defTarget: "ActivityReport",
>         descrMsg: "Enter a short description for this activity.  Press
> [cancel] to continue timer.",
>         askMsg: "Enter the title of a tiddler in which to record this
> activity.  Press [cancel] to continue timer.",
>         errMsg: "'%0' is not a valid tiddler title.  Please try again...\n
> \n",
>         createdMsg: "'%0' has been created",
>         updatedMsg: "'%0' has been updated",
>         marker: "/%"+"tasktimer"+"%/",
>         tag: "task",
>         handler:
> function(place,macroName,params,wikifier,paramString,tiddler) {
>                 var target=params.shift(); // get optional target tiddler 
> title
>                 if (!target) target="";
>                 var format=this.format; if (params[0]) format=params.shift(); 
> // get
> optional output format
>                 var descrMsg=this.descrMsg; if (params[0])
> descrMsg=params.shift(); // get optional message text
>                 var defText=this.defText; if (params[0]) 
> defText=params.shift(); //
> get optional default text
>                 var onclick="config.macros.taskTimer.toggle(this,'"+target
> +"','"+format+"','"+descrMsg+"','"+defText+"')";
>                 createTiddlyElement(place,"span").innerHTML =
>                         '<input type="button" value="start timer" class="'+
> config.macros.taskTimer.class+"_TimerOff" +'" title="'+this.title+'"
> onclick="'+onclick+'">';
>         },
>         toggle: function(here,target,format,msg,defText) {
>                 if (!target || !target.length || target=="here") {
>                         var  tid=story.findContainingTiddler(here);
>                         target=tid?tid.getAttribute("tiddler"):"ask";
>                 }
>                 if (!here.running) { // not running... start timer...
>                         here.startTime=new Date();
>                         var now=here.startTime.formatString("0hh:0mm:0ss");
>                         here.title=(here.target||target)+" - started at "+now;
>                         
> here.value=this.buttonFormat.format([now,now,"00:00:00"]);
>                         here.id=new 
> Date().getTime()+Math.random().toString(); // unique ID
>                         
> here.className=config.macros.taskTimer.class+"_TimerOn";
>                         
> here.ticker=setTimeout("config.macros.taskTimer.tick('"+here.id
> +"')",500);
>                         here.running=true;
>                 } else {
>                         if (target=="ask") {
>                                 
> target=prompt(this.askMsg,here.target||this.defTarget);
>                                 while (target && !target.trim().length)
>                                         
> target=prompt(this.errMsg.format([target])
> +this.askMsg,here.target||this.defTarget);
>                                 if (!target) return; // user cancelled 
> input...  continue timer
>                         }
>                         var txt=prompt(msg,defText); // get description from 
> user
>                         if (!txt) return; // user cancelled input...  
> continue timer
>                         if (target==this.todayKeyword ||
> target.substr(0,this.todayKeyword.length+1)==this.todayKeyword+":")
>                                 target=(new 
> Date()).formatString(this.getJournalFormat(target));
>                         here=document.getElementById(here.id); // RE-get 
> button element
> after timer has stopped...
>                         
> here.className=config.macros.taskTimer.class+"_TimerOff";
>                         clearTimeout(here.ticker);
>                         here.target=target;
>                         var before=this.defHeader;
>                         var after=this.marker+"\n";
>                         var tiddler=store.getTiddler(here.target);
>                         if (tiddler && tiddler.text.length) {
>                                 var pos=tiddler.text.indexOf(this.marker);
>                                 if (pos==-1) pos=tiddler.text.length; // no 
> marker, append content
> to end
>                                 var before=tiddler.text.substr(0,pos); // 
> everything up to marker
>                                 if 
> (before.length&&before.substr(before.length-1)!="\n") before
> +="\n"; // start on a new line
>                                 var after=tiddler.text.substr(pos); // 
> marker+everything else
>                         }
>                         var now=new Date(Math.floor(new Date()/1000)*1000);
>                         var then=new 
> Date(Math.floor(here.startTime/1000)*1000);
>                         var diff=new Date(now-then);
>                         var s=diff.getUTCSeconds(); if (s<10) s="0"+s;
>                         var m=diff.getUTCMinutes(); if (m<10) m="0"+m;
>                         var h=diff.getUTCHours(); if (h<10) h="0"+h;
>                         var start=then.formatString("0hh:0mm:0ss");
>                         var stop=now.formatString("0hh:0mm:0ss");
>                         var elapsed=h+":"+m+":"+s;
>                         var
> dateStamp=now.formatString(config.macros.taskTimer.datestampFormat);
>                         var fieldPatternRe =new RegExp('(\\w+@.*? 
> )|(\\[\\[\\w+@[\\w\\W ]+?
> \\]{2})', 'gi');
>                         var newFormat="";
>                         var currentIndex=0;
>                         var arrMatch;
>
>                         while (arrMatch = fieldPatternRe.exec( format )){
>                                 
> fieldSplit=arrMatch[0].replace(/[\[\]]{2}/g,"").split("@");
>                                 newFormat+=format.substring(currentIndex, 
> arrMatch.index);
>                                 if (field=store.getValue(fieldSplit[1], 
> fieldSplit[0])) {
>                                         newFormat+=field;
>                                 } else {
>                                         
> newFormat+=format.substring(arrMatch.index,
> fieldPatternRe.lastIndex);
>                                 }
>                                 currentIndex=fieldPatternRe.lastIndex;
>                         }
>                         newFormat+=format.substring(currentIndex);
>
>                         format=newFormat;
>
>                         var 
> newtxt=before+format.format([txt,start,stop,elapsed,dateStamp])
> +after;
>                         var newtags=(tiddler?tiddler.tags:['task']); // 
> include 'task' tag
> when creating new tiddlers
>
> store.saveTiddler(here.target,here.target,newtxt,config.options.txtUserName 
> ,new
> Date(),newtags,tiddler?tiddler.fields:null);
>                         if (!tiddler)
> displayMessage(this.createdMsg.format([here.target]));
>                         else 
> displayMessage(this.updatedMsg.format([here.target]));
>                         here.running=false;
>                         here.value=this.label;
>                         here.title=this.title;
>                         var  tid=story.findContainingTiddler(here);
>                         if (!tid || tid.getAttribute("tiddler")!=target) // 
> display target
> tiddler, but only when button is not IN the target tiddler
>
> { story.displayTiddler(story.findContainingTiddler(here),here.target);
> story.refreshTiddler(here.target,1,true); }
>                 }
>         },
>         tick: function(id) {
>                 var here=document.getElementById(id); if (!here) return;
>                 var now=new Date();
>                 var diff=new Date(now-here.startTime);
>                 var s=diff.getUTCSeconds(); if (s<10) s="0"+s;
>                 var m=diff.getUTCMinutes();  if (m<10) m="0"+m;
>                 var h=diff.getUTCHours();  if (h<10) h="0"+h;
>                 var elapsed=h+":"+m+":"+s;
>                 now=now.formatString("0hh:0mm:0ss");
>                 var start=here.startTime.formatString("0hh:0mm:0ss");
>                 here.value=this.buttonFormat.format([now,start,elapsed]);
>                 
> here.ticker=setTimeout("config.macros.taskTimer.tick('"+id+"')",
> 500);
>         },
>         getJournalFormat: function(target) {
>                 var fmt=target.split(":"); fmt.shift(); fmt=fmt.join(":");
>                 if (!fmt || !fmt.length) { // if date format was not specified
>                         if (config.macros.date)  // if installed, use default 
> from
> DatePlugin
>                                 fmt=config.macros.date.linkformat;
>                         if (config.macros.calendar) { // if installed, use 
> default from
> CalendarPlugin
>                                 if (!config.macros.date) // hard-coded 
> calendar fallback if no
> DatePlugin
>                                         
> fmt=config.macros.calendar.tiddlerformat;
>                                 else // journalDateFmt is set when calendar 
> is rendered with
> DatePlugin
>                                         
> fmt=config.macros.calendar.journalDateFmt;
>                         }
>                 }
>                 if (!fmt) { // if not specified and no 
> DatePlugin/CalendarPlugin
>                         // get format from <<newJournal>> in SideBarOptions
>                         var text = store.getTiddlerText("SideBarOptions");
>                         var re=new RegExp("<<(?:newJournal)([^>]*)>>","mg"); 
> var
> fm=re.exec(text);
>                         if (fm && fm[1]!=null) { var 
> pa=fm[1].readMacroParams(); if (pa[0])
> fmt = pa[0]; }
>                 }
>                 if (!fmt) var fmt=this.todayFormat; // no "newJournal"... 
> final
> fallback.
>                 return fmt;
>         }}
>
> //}}}
> --- code end ---

-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWikiDev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/tiddlywikidev?hl=en.

Reply via email to