<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-CommentsInLocalTime.js</id>
	<title>MediaWiki:Gadget-CommentsInLocalTime.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-CommentsInLocalTime.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CommentsInLocalTime.js&amp;action=history"/>
	<updated>2026-04-06T00:17:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CommentsInLocalTime.js&amp;diff=474885&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CommentsInLocalTime.js&amp;diff=474885&amp;oldid=prev"/>
		<updated>2025-11-04T17:47:11Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:47, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CommentsInLocalTime.js&amp;diff=474884&amp;oldid=prev</id>
		<title>wikt&gt;Surjection at 21:21, 11 December 2024</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-CommentsInLocalTime.js&amp;diff=474884&amp;oldid=prev"/>
		<updated>2024-12-11T21:21:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// {{documentation}}&lt;br /&gt;
//  _________________________________________________________________________________________&lt;br /&gt;
// |                                                                                         |&lt;br /&gt;
// |                    === WARNING: GLOBAL GADGET FILE ===                                  |&lt;br /&gt;
// |                  Changes to this page affect many users.                                |&lt;br /&gt;
// | Please discuss changes on the [[Wiktionary:Grease Pit]] before editing.                 |&lt;br /&gt;
// |_________________________________________________________________________________________|&lt;br /&gt;
//&lt;br /&gt;
// &lt;br /&gt;
// The content below are copied from https://en.wikipedia.org/w/index.php?title=User:Gary/comments_in_local_time.js&amp;amp;oldid=1103519446&lt;br /&gt;
// See [[w:User:Gary/comments_in_local_time.js]], [[w:Wikipedia:Comments in Local Time]]&lt;br /&gt;
// *********************************************************************************************************************************&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * COMMENTS IN LOCAL TIME&lt;br /&gt;
 *&lt;br /&gt;
 * Description:&lt;br /&gt;
 * Changes [[Coordinated Universal Time|UTC]]-based times and dates,&lt;br /&gt;
 * such as those used in signatures, to be relative to local time.&lt;br /&gt;
 *&lt;br /&gt;
 * Documentation:&lt;br /&gt;
 * [[Wikipedia:Comments in Local Time]]&lt;br /&gt;
 */&lt;br /&gt;
$(() =&amp;gt; {&lt;br /&gt;
  /**&lt;br /&gt;
   * Given a number, add a leading zero if necessary, so that the final number&lt;br /&gt;
   * has two characters.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {number} number Number&lt;br /&gt;
   * @returns {string} The number with a leading zero, if necessary.&lt;br /&gt;
   */&lt;br /&gt;
  function addLeadingZero(number) {&lt;br /&gt;
    const numberArg = number;&lt;br /&gt;
&lt;br /&gt;
    if (numberArg &amp;lt; 10) {&lt;br /&gt;
      return `0${numberArg}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return numberArg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function convertMonthToNumber(month) {&lt;br /&gt;
    return new Date(`${month} 1, 2001`).getMonth();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function getDates(time) {&lt;br /&gt;
    const [, oldHour, oldMinute, oldDay, oldMonth, oldYear] = time;&lt;br /&gt;
&lt;br /&gt;
    // Today&lt;br /&gt;
    const today = new Date();&lt;br /&gt;
&lt;br /&gt;
    // Yesterday&lt;br /&gt;
    const yesterday = new Date();&lt;br /&gt;
&lt;br /&gt;
    yesterday.setDate(yesterday.getDate() - 1);&lt;br /&gt;
&lt;br /&gt;
    // Tomorrow&lt;br /&gt;
    const tomorrow = new Date();&lt;br /&gt;
&lt;br /&gt;
    tomorrow.setDate(tomorrow.getDate() + 1);&lt;br /&gt;
&lt;br /&gt;
    // Set the date entered.&lt;br /&gt;
    const newTime = new Date();&lt;br /&gt;
&lt;br /&gt;
    newTime.setUTCFullYear(oldYear, convertMonthToNumber(oldMonth), oldDay);&lt;br /&gt;
    newTime.setUTCHours(oldHour);&lt;br /&gt;
    newTime.setUTCMinutes(oldMinute);&lt;br /&gt;
&lt;br /&gt;
    return { time: newTime, today, tomorrow, yesterday };&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /**&lt;br /&gt;
   * Determine whether to use the singular or plural word, and use that.&lt;br /&gt;
   *&lt;br /&gt;
   * @param {string} term Original term&lt;br /&gt;
   * @param {number} count Count of items&lt;br /&gt;
   * @param {string} plural Pluralized term&lt;br /&gt;
   * @returns {string} The word to use&lt;br /&gt;
   */&lt;br /&gt;
  function pluralize(term, count, plural = null) {&lt;br /&gt;
    let pluralArg = plural;&lt;br /&gt;
&lt;br /&gt;
    // No unique pluralized word is found, so just use a general one.&lt;br /&gt;
    if (!pluralArg) {&lt;br /&gt;
      pluralArg = `${term}s`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // There&amp;#039;s only one item, so just use the singular word.&lt;br /&gt;
    if (count === 1) {&lt;br /&gt;
      return term;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // There are multiple items, so use the plural word.&lt;br /&gt;
    return pluralArg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  class CommentsInLocalTime {&lt;br /&gt;
    constructor() {&lt;br /&gt;
      this.language = &amp;#039;&amp;#039;;&lt;br /&gt;
      this.LocalComments = {};&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Settings&lt;br /&gt;
       */&lt;br /&gt;
      this.settings();&lt;br /&gt;
&lt;br /&gt;
      this.language = this.setDefaultSetting(&lt;br /&gt;
        &amp;#039;language&amp;#039;,&lt;br /&gt;
        this.LocalComments.language&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
      // These values are also reflected in the documentation:&lt;br /&gt;
      // https://en.wikipedia.org/wiki/Wikipedia:Comments_in_Local_Time#Default_settings&lt;br /&gt;
      this.setDefaultSetting({&lt;br /&gt;
        dateDifference: true,&lt;br /&gt;
        dateFormat: &amp;#039;dmy&amp;#039;,&lt;br /&gt;
        dayOfWeek: true,&lt;br /&gt;
        dropDays: 0,&lt;br /&gt;
        dropMonths: 0,&lt;br /&gt;
        timeFirst: true,&lt;br /&gt;
        twentyFourHours: false,&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    adjustTime(originalTimestamp, search) {&lt;br /&gt;
      const { time, today, tomorrow, yesterday } = getDates(&lt;br /&gt;
        originalTimestamp.match(search)&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
      // A string matching the date pattern was found, but it cannot be&lt;br /&gt;
      // converted to a Date object. Return it with no changes made.&lt;br /&gt;
      if (Number.isNaN(time)) {&lt;br /&gt;
        return [originalTimestamp, &amp;#039;&amp;#039;];&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      const date = this.determineDateText({&lt;br /&gt;
        time,&lt;br /&gt;
        today,&lt;br /&gt;
        tomorrow,&lt;br /&gt;
        yesterday,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      const { ampm, hour } = this.getHour(time);&lt;br /&gt;
      const minute = addLeadingZero(time.getMinutes());&lt;br /&gt;
      const finalTime = `${hour}:${minute}${ampm}`;&lt;br /&gt;
&lt;br /&gt;
      // Determine the time offset.&lt;br /&gt;
      const utcValue = (-1 * time.getTimezoneOffset()) / 60;&lt;br /&gt;
      const utcOffset =&lt;br /&gt;
        utcValue &amp;gt;= 0 ? `+${utcValue}` : `−${Math.abs(utcValue.toFixed(1))}`;&lt;br /&gt;
&lt;br /&gt;
      const utcPart = `(UTC${utcOffset})`;&lt;br /&gt;
&lt;br /&gt;
      const returnDate = this.LocalComments.timeFirst&lt;br /&gt;
        ? `${finalTime}, ${date} ${utcPart}`&lt;br /&gt;
        : `${date}, ${finalTime} ${utcPart}`;&lt;br /&gt;
&lt;br /&gt;
      return returnDate;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    convertNumberToMonth(number) {&lt;br /&gt;
      return [&lt;br /&gt;
        this.language.January,&lt;br /&gt;
        this.language.February,&lt;br /&gt;
        this.language.March,&lt;br /&gt;
        this.language.April,&lt;br /&gt;
        this.language.May,&lt;br /&gt;
        this.language.June,&lt;br /&gt;
        this.language.July,&lt;br /&gt;
        this.language.August,&lt;br /&gt;
        this.language.September,&lt;br /&gt;
        this.language.October,&lt;br /&gt;
        this.language.November,&lt;br /&gt;
        this.language.December,&lt;br /&gt;
      ][number];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    createDateText({ day, month, time, today, year }) {&lt;br /&gt;
      // Calculate day of week&lt;br /&gt;
      const dayNames = [&lt;br /&gt;
        this.language.Sunday,&lt;br /&gt;
        this.language.Monday,&lt;br /&gt;
        this.language.Tuesday,&lt;br /&gt;
        this.language.Wednesday,&lt;br /&gt;
        this.language.Thursday,&lt;br /&gt;
        this.language.Friday,&lt;br /&gt;
        this.language.Saturday,&lt;br /&gt;
      ];&lt;br /&gt;
      const dayOfTheWeek = dayNames[time.getDay()];&lt;br /&gt;
      let descriptiveDifference = &amp;#039;&amp;#039;;&lt;br /&gt;
      let last = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      // Create a relative descriptive difference&lt;br /&gt;
      if (this.LocalComments.dateDifference) {&lt;br /&gt;
        ({ descriptiveDifference, last } = this.createRelativeDate(&lt;br /&gt;
          today,&lt;br /&gt;
          time&lt;br /&gt;
        ));&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      const monthName = this.convertNumberToMonth(time.getMonth());&lt;br /&gt;
&lt;br /&gt;
      // Format the date according to user preferences&lt;br /&gt;
      let formattedDate = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      switch (this.LocalComments.dateFormat.toLowerCase()) {&lt;br /&gt;
        case &amp;#039;dmy&amp;#039;:&lt;br /&gt;
          formattedDate = `${day} ${monthName} ${year}`;&lt;br /&gt;
&lt;br /&gt;
          break;&lt;br /&gt;
        case &amp;#039;mdy&amp;#039;:&lt;br /&gt;
          formattedDate = `${monthName} ${day}, ${year}`;&lt;br /&gt;
&lt;br /&gt;
          break;&lt;br /&gt;
        default:&lt;br /&gt;
          formattedDate = `${year}-${month}-${addLeadingZero(day)}`;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      const formattedDayOfTheWeek = this.LocalComments.dayOfWeek&lt;br /&gt;
        ? `, ${last}${dayOfTheWeek}`&lt;br /&gt;
        : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      return `${formattedDate}${formattedDayOfTheWeek}${descriptiveDifference}`;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Create relative date data.&lt;br /&gt;
     *&lt;br /&gt;
     * @param {Date} today Today&lt;br /&gt;
     * @param {Date} time The timestamp from a comment&lt;br /&gt;
     * @returns {Object.&amp;lt;string, *&amp;gt;} Relative date data&lt;br /&gt;
     */&lt;br /&gt;
    createRelativeDate(today, time) {&lt;br /&gt;
      /**&lt;br /&gt;
       * The time difference from today, in milliseconds.&lt;br /&gt;
       *&lt;br /&gt;
       * @type {number}&lt;br /&gt;
       */&lt;br /&gt;
      const millisecondsAgo = today.getTime() - time.getTime();&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The number of days ago, that we will display. It&amp;#039;s not necessarily the&lt;br /&gt;
       * total days ago.&lt;br /&gt;
       *&lt;br /&gt;
       * @type {number}&lt;br /&gt;
       */&lt;br /&gt;
      let daysAgo = Math.abs(Math.round(millisecondsAgo / 1000 / 60 / 60 / 24));&lt;br /&gt;
      const { differenceWord, last } = this.relativeText({&lt;br /&gt;
        daysAgo,&lt;br /&gt;
        millisecondsAgo,&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      // This method of computing the years and months is not exact. However,&lt;br /&gt;
      // it&amp;#039;s better than the previous method that used 1 January + delta days.&lt;br /&gt;
      // That was usually quite off because it mapped the second delta month to&lt;br /&gt;
      // February, which has only 28 days. This method is usually not more than&lt;br /&gt;
      // one day off, except perhaps over very distant dates.&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The number of months ago, that we will display. It&amp;#039;s not necessarily&lt;br /&gt;
       * the total months ago.&lt;br /&gt;
       *&lt;br /&gt;
       * @type {number}&lt;br /&gt;
       */&lt;br /&gt;
      let monthsAgo = Math.floor((daysAgo / 365) * 12);&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The total amount of time ago, in months.&lt;br /&gt;
       *&lt;br /&gt;
       * @type {number}&lt;br /&gt;
       */&lt;br /&gt;
      const totalMonthsAgo = monthsAgo;&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * The number of years ago that we will display. It&amp;#039;s not necessarily the&lt;br /&gt;
       * total years ago.&lt;br /&gt;
       *&lt;br /&gt;
       * @type {number}&lt;br /&gt;
       */&lt;br /&gt;
      let yearsAgo = Math.floor(totalMonthsAgo / 12);&lt;br /&gt;
&lt;br /&gt;
      if (totalMonthsAgo &amp;lt; this.LocalComments.dropMonths) {&lt;br /&gt;
        yearsAgo = 0;&lt;br /&gt;
      } else if (this.LocalComments.dropMonths &amp;gt; 0) {&lt;br /&gt;
        monthsAgo = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        monthsAgo -= yearsAgo * 12;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (daysAgo &amp;lt; this.LocalComments.dropDays) {&lt;br /&gt;
        monthsAgo = 0;&lt;br /&gt;
        yearsAgo = 0;&lt;br /&gt;
      } else if (this.LocalComments.dropDays &amp;gt; 0 &amp;amp;&amp;amp; totalMonthsAgo &amp;gt;= 1) {&lt;br /&gt;
        daysAgo = 0;&lt;br /&gt;
      } else {&lt;br /&gt;
        daysAgo -= Math.floor((totalMonthsAgo * 365) / 12);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      const descriptiveParts = [];&lt;br /&gt;
&lt;br /&gt;
      // There is years text to add.&lt;br /&gt;
      if (yearsAgo &amp;gt; 0) {&lt;br /&gt;
        descriptiveParts.push(&lt;br /&gt;
          `${yearsAgo} ${pluralize(&lt;br /&gt;
            this.language.year,&lt;br /&gt;
            yearsAgo,&lt;br /&gt;
            this.language.years&lt;br /&gt;
          )}`&lt;br /&gt;
        );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // There is months text to add.&lt;br /&gt;
      if (monthsAgo &amp;gt; 0) {&lt;br /&gt;
        descriptiveParts.push(&lt;br /&gt;
          `${monthsAgo} ${pluralize(&lt;br /&gt;
            this.language.month,&lt;br /&gt;
            monthsAgo,&lt;br /&gt;
            this.language.months&lt;br /&gt;
          )}`&lt;br /&gt;
        );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // There is days text to add.&lt;br /&gt;
      if (daysAgo &amp;gt; 0) {&lt;br /&gt;
        descriptiveParts.push(&lt;br /&gt;
          `${daysAgo} ${pluralize(&lt;br /&gt;
            this.language.day,&lt;br /&gt;
            daysAgo,&lt;br /&gt;
            this.language.days&lt;br /&gt;
          )}`&lt;br /&gt;
        );&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return {&lt;br /&gt;
        descriptiveDifference: ` (${descriptiveParts.join(&lt;br /&gt;
          &amp;#039;, &amp;#039;&lt;br /&gt;
        )} ${differenceWord})`,&lt;br /&gt;
        last,&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    determineDateText({ time, today, tomorrow, yesterday }) {&lt;br /&gt;
      // Set the date bits to output.&lt;br /&gt;
      const year = time.getFullYear();&lt;br /&gt;
      const month = addLeadingZero(time.getMonth() + 1);&lt;br /&gt;
      const day = time.getDate();&lt;br /&gt;
&lt;br /&gt;
      // Return &amp;#039;today&amp;#039; or &amp;#039;yesterday&amp;#039; if that is the case&lt;br /&gt;
      if (&lt;br /&gt;
        year === today.getFullYear() &amp;amp;&amp;amp;&lt;br /&gt;
        month === addLeadingZero(today.getMonth() + 1) &amp;amp;&amp;amp;&lt;br /&gt;
        day === today.getDate()&lt;br /&gt;
      ) {&lt;br /&gt;
        return this.language.Today;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (&lt;br /&gt;
        year === yesterday.getFullYear() &amp;amp;&amp;amp;&lt;br /&gt;
        month === addLeadingZero(yesterday.getMonth() + 1) &amp;amp;&amp;amp;&lt;br /&gt;
        day === yesterday.getDate()&lt;br /&gt;
      ) {&lt;br /&gt;
        return this.language.Yesterday;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      if (&lt;br /&gt;
        year === tomorrow.getFullYear() &amp;amp;&amp;amp;&lt;br /&gt;
        month === addLeadingZero(tomorrow.getMonth() + 1) &amp;amp;&amp;amp;&lt;br /&gt;
        day === tomorrow.getDate()&lt;br /&gt;
      ) {&lt;br /&gt;
        return this.language.Tomorrow;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return this.createDateText({ day, month, time, today, year });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    getHour(time) {&lt;br /&gt;
      let ampm;&lt;br /&gt;
      let hour = Number.parseInt(time.getHours(), 10);&lt;br /&gt;
&lt;br /&gt;
      if (this.LocalComments.twentyFourHours) {&lt;br /&gt;
        ampm = &amp;#039;&amp;#039;;&lt;br /&gt;
        hour = addLeadingZero(hour);&lt;br /&gt;
      } else {&lt;br /&gt;
        // Output am or pm depending on the date.&lt;br /&gt;
        ampm = hour &amp;lt;= 11 ? &amp;#039; am&amp;#039; : &amp;#039; pm&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if (hour &amp;gt; 12) {&lt;br /&gt;
          hour -= 12;&lt;br /&gt;
        } else if (hour === 0) {&lt;br /&gt;
          hour = 12;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return { ampm, hour };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    relativeText({ daysAgo, millisecondsAgo }) {&lt;br /&gt;
      let differenceWord = &amp;#039;&amp;#039;;&lt;br /&gt;
      let last = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      // The date is in the past.&lt;br /&gt;
      if (millisecondsAgo &amp;gt;= 0) {&lt;br /&gt;
        differenceWord = this.language.ago;&lt;br /&gt;
&lt;br /&gt;
        if (daysAgo &amp;lt;= 7) {&lt;br /&gt;
          last = `${this.language.last} `;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // The date is in the future.&lt;br /&gt;
      } else {&lt;br /&gt;
        differenceWord = this.language[&amp;#039;from now&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
        if (daysAgo &amp;lt;= 7) {&lt;br /&gt;
          last = `${this.language.this} `;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return { differenceWord, last };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    replaceText(node, search) {&lt;br /&gt;
      if (!node) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Check if this is a text node.&lt;br /&gt;
      if (node.nodeType === 3) {&lt;br /&gt;
        // Don&amp;#039;t continue if this text node&amp;#039;s parent tag is one of these.&lt;br /&gt;
        if ([&amp;#039;CODE&amp;#039;, &amp;#039;PRE&amp;#039;].includes(node.parentNode.nodeName)) {&lt;br /&gt;
          return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        const value = node.nodeValue;&lt;br /&gt;
        const matches = value.match(search);&lt;br /&gt;
&lt;br /&gt;
        if (matches) {&lt;br /&gt;
          // Only act on the first timestamp we found in this node. This is for&lt;br /&gt;
          // the rare occassion that there is more than one timestamp in the&lt;br /&gt;
          // same text node.&lt;br /&gt;
          const [match] = matches;&lt;br /&gt;
          const position = value.search(search);&lt;br /&gt;
          const stringLength = match.toString().length;&lt;br /&gt;
&lt;br /&gt;
          // Grab the text content before and after the matching timestamp,&lt;br /&gt;
          // which we&amp;#039;ll then wrap in their own SPAN nodes.&lt;br /&gt;
          const beforeMatch = value.slice(0, position);&lt;br /&gt;
          const afterMatch = value.slice(position + stringLength);&lt;br /&gt;
          const returnDate = this.adjustTime(match.toString(), search);&lt;br /&gt;
&lt;br /&gt;
          // Create the code to display the new local comments content.&lt;br /&gt;
          const $span = $(&lt;br /&gt;
            `&amp;lt;span class=&amp;quot;localcomments&amp;quot; style=&amp;quot;font-size: 95%;&amp;quot; title=&amp;quot;${match}&amp;quot;&amp;gt;${returnDate}&amp;lt;/span&amp;gt;`&lt;br /&gt;
          );&lt;br /&gt;
&lt;br /&gt;
          // Replace the existing text node in the page with our new local&lt;br /&gt;
          // comments node.&lt;br /&gt;
          $(node).replaceWith($span);&lt;br /&gt;
&lt;br /&gt;
          // Replace the text content that appears before the timestamp.&lt;br /&gt;
          if (beforeMatch) {&lt;br /&gt;
            $span.before(&lt;br /&gt;
              `&amp;lt;span class=&amp;quot;before-localcomments&amp;quot;&amp;gt;${beforeMatch}&amp;lt;/span&amp;gt;`&lt;br /&gt;
            );&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          // Replace the text content that appears after the timestamp.&lt;br /&gt;
          if (afterMatch) {&lt;br /&gt;
            $span.after(&lt;br /&gt;
              `&amp;lt;span class=&amp;quot;after-localcomments&amp;quot;&amp;gt;${afterMatch}&amp;lt;/span&amp;gt;`&lt;br /&gt;
            );&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        const children = [];&lt;br /&gt;
        let child;&lt;br /&gt;
&lt;br /&gt;
        [child] = node.childNodes;&lt;br /&gt;
&lt;br /&gt;
        while (child) {&lt;br /&gt;
          children.push(child);&lt;br /&gt;
          child = child.nextSibling;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Loop through children and run this func on it again, recursively.&lt;br /&gt;
        children.forEach((child2) =&amp;gt; {&lt;br /&gt;
          this.replaceText(child2, search);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run() {&lt;br /&gt;
      if (&lt;br /&gt;
        [&amp;#039;&amp;#039;, &amp;#039;MediaWiki&amp;#039;, &amp;#039;Special&amp;#039;].includes(&lt;br /&gt;
          mw.config.get(&amp;#039;wgCanonicalNamespace&amp;#039;)&lt;br /&gt;
        )&lt;br /&gt;
      ) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // Check for disabled URLs.&lt;br /&gt;
      const isDisabledUrl = [&amp;#039;action=history&amp;#039;].some((disabledUrl) =&amp;gt;&lt;br /&gt;
        document.location.href.includes(disabledUrl)&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
      if (isDisabledUrl) {&lt;br /&gt;
        return;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      this.replaceText(&lt;br /&gt;
        document.querySelector(&amp;#039;.mw-body-content .mw-parser-output&amp;#039;),&lt;br /&gt;
        /(\d{1,2}):(\d{2}), (\d{1,2}) ([A-Z][a-z]+) (\d{4}) \(UTC\)/&lt;br /&gt;
      );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    setDefaultSetting(...args) {&lt;br /&gt;
      // There are no arguments.&lt;br /&gt;
      if (args.length === 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // The first arg is an object, so just set that data directly onto the&lt;br /&gt;
      // settings object. like {setting 1: true, setting 2: false}&lt;br /&gt;
      if (typeof args[0] === &amp;#039;object&amp;#039;) {&lt;br /&gt;
        const [settings] = args;&lt;br /&gt;
&lt;br /&gt;
        // Loop through each setting.&lt;br /&gt;
        Object.keys(settings).forEach((name) =&amp;gt; {&lt;br /&gt;
          const value = settings[name];&lt;br /&gt;
&lt;br /&gt;
          if (typeof this.LocalComments[name] === &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
            this.LocalComments[name] = value;&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return settings;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      // The first arg is a string, so use the first arg as the settings key,&lt;br /&gt;
      // and the second arg as the value to set it to.&lt;br /&gt;
      const [name, setting] = args;&lt;br /&gt;
&lt;br /&gt;
      if (typeof this.LocalComments[name] === &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
        this.LocalComments[name] = setting;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      return this.LocalComments[name];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Set the script&amp;#039;s settings.&lt;br /&gt;
     *&lt;br /&gt;
     * @returns {undefined}&lt;br /&gt;
     */&lt;br /&gt;
    settings() {&lt;br /&gt;
      // The user has set custom settings, so use those.&lt;br /&gt;
      if (window.LocalComments) {&lt;br /&gt;
        this.LocalComments = window.LocalComments;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      /**&lt;br /&gt;
       * Language&lt;br /&gt;
       *&lt;br /&gt;
       * LOCALIZING THIS SCRIPT&lt;br /&gt;
       * To localize this script, change the terms below,&lt;br /&gt;
       * to the RIGHT of the colons, to the correct term used in that language.&lt;br /&gt;
       *&lt;br /&gt;
       * For example, in the French language,&lt;br /&gt;
       *&lt;br /&gt;
       * &amp;#039;Today&amp;#039; : &amp;#039;Today&amp;#039;,&lt;br /&gt;
       *&lt;br /&gt;
       * would be&lt;br /&gt;
       *&lt;br /&gt;
       * &amp;#039;Today&amp;#039; : &amp;quot;Aujourd&amp;#039;hui&amp;quot;,&lt;br /&gt;
       */&lt;br /&gt;
      this.LocalComments.language = {&lt;br /&gt;
        // Relative terms&lt;br /&gt;
        Today: &amp;#039;Today&amp;#039;,&lt;br /&gt;
        Yesterday: &amp;#039;Yesterday&amp;#039;,&lt;br /&gt;
        Tomorrow: &amp;#039;Tomorrow&amp;#039;,&lt;br /&gt;
        last: &amp;#039;last&amp;#039;,&lt;br /&gt;
        this: &amp;#039;this&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        // Days of the week&lt;br /&gt;
        Sunday: &amp;#039;Sunday&amp;#039;,&lt;br /&gt;
        Monday: &amp;#039;Monday&amp;#039;,&lt;br /&gt;
        Tuesday: &amp;#039;Tuesday&amp;#039;,&lt;br /&gt;
        Wednesday: &amp;#039;Wednesday&amp;#039;,&lt;br /&gt;
        Thursday: &amp;#039;Thursday&amp;#039;,&lt;br /&gt;
        Friday: &amp;#039;Friday&amp;#039;,&lt;br /&gt;
        Saturday: &amp;#039;Saturday&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        // Months of the year&lt;br /&gt;
        January: &amp;#039;January&amp;#039;,&lt;br /&gt;
        February: &amp;#039;February&amp;#039;,&lt;br /&gt;
        March: &amp;#039;March&amp;#039;,&lt;br /&gt;
        April: &amp;#039;April&amp;#039;,&lt;br /&gt;
        May: &amp;#039;May&amp;#039;,&lt;br /&gt;
        June: &amp;#039;June&amp;#039;,&lt;br /&gt;
        July: &amp;#039;July&amp;#039;,&lt;br /&gt;
        August: &amp;#039;August&amp;#039;,&lt;br /&gt;
        September: &amp;#039;September&amp;#039;,&lt;br /&gt;
        October: &amp;#039;October&amp;#039;,&lt;br /&gt;
        November: &amp;#039;November&amp;#039;,&lt;br /&gt;
        December: &amp;#039;December&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        // Difference words&lt;br /&gt;
        ago: &amp;#039;ago&amp;#039;,&lt;br /&gt;
        &amp;#039;from now&amp;#039;: &amp;#039;from now&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        // Date phrases&lt;br /&gt;
        year: &amp;#039;year&amp;#039;,&lt;br /&gt;
        years: &amp;#039;years&amp;#039;,&lt;br /&gt;
        month: &amp;#039;month&amp;#039;,&lt;br /&gt;
        months: &amp;#039;months&amp;#039;,&lt;br /&gt;
        day: &amp;#039;day&amp;#039;,&lt;br /&gt;
        days: &amp;#039;days&amp;#039;,&lt;br /&gt;
      };&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Check if we&amp;#039;ve already ran this script.&lt;br /&gt;
  if (window.commentsInLocalTimeWasRun) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  window.commentsInLocalTimeWasRun = true;&lt;br /&gt;
&lt;br /&gt;
  const commentsInLocalTime = new CommentsInLocalTime();&lt;br /&gt;
&lt;br /&gt;
  commentsInLocalTime.run();&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>wikt&gt;Surjection</name></author>
	</entry>
</feed>