topical media & game development

talk show tell print

lib-flex-animation-code-10-org-as3lib-kitchensync-utils-TimeStringParser-en.ax

lib-flex-animation-code-10-org-as3lib-kitchensync-utils-TimeStringParser-en.ax (swf ) [ flash ] flex


  package org.as3lib.kitchensync.utils
  {
          
          
Parses a time string into milliseconds.

   
          public class @ax-lib-flex-animation-code-10-org-as3lib-kitchensync-utils-TimeStringParser-en implements ITimeStringParser
          {
                  public static const MILLISECONDS_VALUE:Number = 1;
                  public static const SECONDS_VALUE:Number = 1000;
                  public static const MINUTES_VALUE:Number = 60000;
                  public static const HOURS_VALUE:Number = 3600000;
                  public static const DAYS_VALUE:Number = 86400000;
                  
                  protected static const NUMBER_UNIT_PAIR_SEARCH:RegExp = /(\d+(\.\d+)?)\s*[a-z]+\s*,?\s*/g;
                  protected static const NUMBER_SEARCH:RegExp = /\d+(\.\d+)?/g;
                  protected static const LETTER_SEARCH:RegExp = /[a-z]+/;
                  
                  protected static const FRAMES_SEARCH:RegExp = /([^a-z]|^)(f|fr|frames?)/;
                  protected static const MILLISECONDS_SEARCH:RegExp = /([^a-z]|^)(ms|msecs?|milliseconds?)/;
                  protected static const SECONDS_SEARCH:RegExp = /([^a-z]|^)(s|secs?|seconds?)/;
                  protected static const MINUTES_SEARCH:RegExp = /([^a-z]|^)(m|mins?|minutes?)/;
                  protected static const HOURS_SEARCH:RegExp = /(h|hrs?|hours?)/;
                  protected static const DAYS_SEARCH:RegExp = /(d|days?)/;
                  protected static const TIMECODE_FORMAT_SEARCH:RegExp = /(\d\d?)?(:\d\d)+(;\d\d)?/;
                  protected static const TIMECODE_SEGMENT_SEARCH:RegExp = /(^\d\d?)|(:\d\d)/g;
                  protected static const TIMECODE_FRAME_SEARCH:RegExp = /;(\d\d)/;
                  protected static const TIMECODE_DIGIT_SEARCH:RegExp = /(\d\d?)/;
                  
                  
                  public function @ax-lib-flex-animation-code-10-org-as3lib-kitchensync-utils-TimeStringParser-en() {
                          super();        
                  }
  
                  
Parses a string into milliseconds. Times can use multiple units. Each unit should be separated by a comma or a space. Units will only be detected if they are placed after the time value. All times will be returned in milliseconds. If no time unit is specified, the result will use null for the time unit and the synchronized action will use its default. These are all valid options: "1 hour, 2 minutes, 3 seconds, 4 milliseconds" "1h2m3s4ms" "5sec,12fr" "01:23:45;15" (1h, 23m, 45s, 15f - frames are based on stage's framerate) ":03" (3s) "300 frames" "1.25s" "5 milliseconds, 15mins, 6 hrs" "0.25 days"
parameter: timeString - a string representing some ammount of time.
returns: An int containing the time in milliseconds

  
                  public function parseTimeString(timeString:String):int
                  {
                          // define an object to hold the results
                          var result:Number = 0;
                          
                          // if the string is empty, throw an error. 
                          if (!timeString) { throw new SyntaxError("The input object containes no data."); return null;}
                          
                          // if string contains only a number value, return it and don't specify a time unit
                          if (!isNaN(Number(timeString))) {
                                  result = Number(timeString);
                                  return result;
                          }
                          
                          // make time string not case sensitive
                          timeString = timeString.toLocaleLowerCase();
                          
                          // Process timecode from time string if it extists.
                          if (timeString.search(TIMECODE_FORMAT_SEARCH) >= 0) {
                                  var ms:int = 0;
                                  
                                  //trace("Converting timecode -", timeString, ".......");
                                  
                                  // Extract the times from the timecode if there are any.
                                  var timeMatch:Array = timeString.match(TIMECODE_SEGMENT_SEARCH);
                                  if (timeMatch && timeMatch.length >= 1) {
                                          timeMatch = timeMatch.reverse();
  
                                          // Timecodes with more than 4 segments aren't supported
                                          if (timeMatch.length > 4) {
                                                  throw new SyntaxError("The timecode wasn't formatted correctly. It has too many segments.");
                                          }
                                          
                                          
                                          // check for seconds
                                          if (timeMatch[0]) {
                                                  
                                                  ms = timeMatch[0].toString().match(TIMECODE_DIGIT_SEARCH)[0] * SECONDS_VALUE;
                                                  result += ms;
                                                  //trace("s +" + ms);
                                          }
                                          // check for minutes
                                          if (timeMatch[1]) {
                                                  ms = timeMatch[1].toString().match(TIMECODE_DIGIT_SEARCH)[0] * MINUTES_VALUE;
                                                  result += ms;
                                                  //trace("m +" + ms);
                                          }
                                          // check for hours
                                          if (timeMatch[2]) {
                                                  ms = timeMatch[2].toString().match(TIMECODE_DIGIT_SEARCH)[0] * HOURS_VALUE;
                                                  result += ms;
                                                  //trace("h +" + ms);
                                          }
                                          // check for days
                                          if (timeMatch[3]) {
                                                  ms = timeMatch[3].toString().match(TIMECODE_DIGIT_SEARCH)[0] * DAYS_VALUE;
                                                  result += ms;
                                                  //trace("d +" + ms);
                                          }
                                  }
                                  
                                  // Extract the frames from the timecode if there are any.
                                  var frameMatch:Array = timeString.match(TIMECODE_FRAME_SEARCH);
                                  if (frameMatch && frameMatch.length >= 1) {
                                          ms = TimestampUtil.framesToMilliseconds(frameMatch[0].toString().match(TIMECODE_DIGIT_SEARCH)[0]);
                                          result += ms;
                                          //trace ("f +" + ms);
                                  }
                                  
                                  //trace ("  = " + result + "ms");
                                  return result;
                          }
                          
                          // separate by number / unit pairs separated by spaces or commas.
                          var unitValuePairs:Array = timeString.match(NUMBER_UNIT_PAIR_SEARCH);
                          // if there are no pairs, the data is malformed.
                          if (unitValuePairs.length < 1) {
                                  throw new SyntaxError("The input object contains malformed data: " + timeString);
                                  return null;
                          }
                          
                          // for each unit value pair...
                          for each (var pair:String in unitValuePairs) {
                                  
                                  // separate the number from the text unit identifier
                                  var time:Number = Number(pair.match(NUMBER_SEARCH)[0]);
                                  var timeUnit:String = pair.match(LETTER_SEARCH)[0];
                                  
                                  //based on the time unit, convert the time value to milliseconds
                                  if (timeUnit.search(FRAMES_SEARCH) >= 0) {
                                          // Convert frames to milliseconds
                                          time = TimestampUtil.framesToMilliseconds(time);
                                  } else {
                                          if (timeUnit.search(MILLISECONDS_SEARCH) >= 0) {
                                                  time *= MILLISECONDS_VALUE;
                                          } else if (timeUnit.search(SECONDS_SEARCH) >= 0) {
                                                  time *= SECONDS_VALUE;
                                          } else if (timeUnit.search(MINUTES_SEARCH) >= 0) {
                                                  time *= MINUTES_VALUE;
                                          } else if (timeUnit.search(HOURS_SEARCH) >= 0) {
                                                  time *= HOURS_VALUE;
                                          } else if (timeUnit.search(DAYS_SEARCH) >= 0) {
                                                  time *= DAYS_VALUE;
                                          } else {
                                                  // this is probably a different type of unit.
                                                  throw new SyntaxError("The input object contains malformed data.");
                                                  continue;
                                          }
                                  }
                                  time = Math.round(time);
                                  result += time;
                          } 
                          // return the result as an integer
                          return int(result);
                  }
          }
  }


(C) Æliens 19/08/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.