-1

So I'm using this thing called timeago. For those who don't know it, can be found here. http://timeago.yarp.com/

It's pretty cool, but I want to add the word "happened". How can I add the word "Happened" at the beginning of every "ago" phrase? So instead of saying "3 minutes ago" it'd say "happened 3 minutes ago". Instead of "less than a minute ago", it'd say "happened less than a minute ago".

Thanks!

(function($) {
  $.timeago = function(timestamp) {
    if (timestamp instanceof Date) {
      return inWords(timestamp);
    } else if (typeof timestamp === "string") {
      return inWords($.timeago.parse(timestamp));
    } else {
      return inWords($.timeago.datetime(timestamp));
    }
  };
  var $t = $.timeago;

  $.extend($.timeago, {
    settings: {
      refreshMillis: 60000,
      allowFuture: false,
      strings: {
        prefixAgo: null,
        prefixFromNow: null,
        suffixAgo: "ago",
        suffixFromNow: "from now",
        seconds: "less than a minute",
        minute: "about a minute",
        minutes: "%d minutes",
        hour: "about an hour",
        hours: "about %d hours",
        day: "a day",
        days: "%d days",
        month: "about a month",
        months: "%d months",
        year: "about a year",
        years: "%d years",
        numbers: []
      }
    },
    inWords: function(distanceMillis) {
      var $l = this.settings.strings;
      var prefix = $l.prefixAgo;
      var suffix = $l.suffixAgo;
      if (this.settings.allowFuture) {
        if (distanceMillis < 0) {
          prefix = $l.prefixFromNow;
          suffix = $l.suffixFromNow;
        }
        distanceMillis = Math.abs(distanceMillis);
      }

      var seconds = distanceMillis / 1000;
      var minutes = seconds / 60;
      var hours = minutes / 60;
      var days = hours / 24;
      var years = days / 365;

      function substitute(stringOrFunction, number) {
        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
        var value = ($l.numbers && $l.numbers[number]) || number;
        return string.replace(/%d/i, value);
      }

      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
        seconds < 90 && substitute($l.minute, 1) ||
        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
        minutes < 90 && substitute($l.hour, 1) ||
        hours < 24 && substitute($l.hours, Math.round(hours)) ||
        hours < 48 && substitute($l.day, 1) ||
        days < 30 && substitute($l.days, Math.floor(days)) ||
        days < 60 && substitute($l.month, 1) ||
        days < 365 && substitute($l.months, Math.floor(days / 30)) ||
        years < 2 && substitute($l.year, 1) ||
        substitute($l.years, Math.floor(years));

      return $.trim([prefix, words, suffix].join(" "));
    },
    parse: function(iso8601) {
      var s = $.trim(iso8601);
      s = s.replace(/\.\d\d\d+/,""); // remove milliseconds
      s = s.replace(/-/,"/").replace(/-/,"/");
      s = s.replace(/T/," ").replace(/Z/," UTC");
      s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
      return new Date(s);
    },
    datetime: function(elem) {
      // jQuery's `is()` doesn't play well with HTML5 in IE
      var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
      var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title");
      return $t.parse(iso8601);
    }
  });

  $.fn.timeago = function() {
    var self = this;
    self.each(refresh);

    var $s = $t.settings;
    if ($s.refreshMillis > 0) {
      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
    }
    return self;
  };

  function refresh() {
    var data = prepareData(this);
    if (!isNaN(data.datetime)) {
      $(this).text(inWords(data.datetime));
    }
    return this;
  }

  function prepareData(element) {
    element = $(element);
    if (!element.data("timeago")) {
      element.data("timeago", { datetime: $t.datetime(element) });
      var text = $.trim(element.text());
      if (text.length > 0) {
        element.attr("title", text);
      }
    }
    return element.data("timeago");
  }

  function inWords(date) {
    return $t.inWords(distance(date));
  }

  function distance(date) {
    return (new Date().getTime() - date.getTime());
  }

  // fix for IE6 suckage
  document.createElement("abbr");
  document.createElement("time");
}(jQuery));
1
  • So, is this code the source code of that plugin? What about your own code? Commented Apr 4, 2011 at 0:30

2 Answers 2

4

I'm unfamiliar with that library although it looks really nice. Reading your post though I think I have a solution.

Update:

prefixAgo: null,

To:

prefixAgo: 'Happened',

Update

Hmz, just realized that's the plugin and not your script using it. Try updating your script with this line in one of your inits:

jQuery.timeago.settings.strings.prefixAgo = 'Happened';
Sign up to request clarification or add additional context in comments.

3 Comments

Hmmm? Where would I add the jQuery.timeago.settings.strings.prefixAgo = 'Happened'; ? Also single quote or double quote? I know php, you should use single for the most part so apache only parses it once... or something like that hah.
At the top of your scripts? Or anytime before you use the timeago library.
@user657847 in JavaScript single or double quotes does not matter. It's completely the same.
3

Try changing

    prefixAgo: null,

To

    prefixAgo: "Happened",

This should prepend everything with the word "Happened "

To avoid modifying the actual source you can add a line to your own code instead.

$.timeago.settings.strings.prefix = "Happened";

8 Comments

Not a good idea to modify a plugin in case it gets updated and you replace the old version with the new version.
Good stuff! I'll accept your answer in 7minutes hah. Thank you. I'm guessing single quote and double doesn't really matter (as the person below used single).
@BoltClock I agree. It's a pity the plugin doesn't allow you to overwrite the settings yourself.
But that's what you just added to your answer :)
@BoltClock that's overwriting them on some global object. I would have preferred it if there was a $.timeago({ "strings": { "prefix": "Happened" } }) instead or some other kind of method where you pass in an options collection like you can do with the other 80% of jQuery plugins.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.