Event Merge for Google Calendar™ (by @imightbeAmy)

Script that visually merges the same event on multiple Google Calendars into one event.

当前为 2015-05-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Event Merge for Google Calendar™ (by @imightbeAmy)
  3. // @namespace gcal-multical-event-merge
  4. // @include https://www.google.com/calendar/*
  5. // @include http://www.google.com/calendar/*
  6. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
  7. // @version 1
  8. // @grant none
  9. // @description Script that visually merges the same event on multiple Google Calendars into one event.
  10. // ==/UserScript==
  11.  
  12. 'use strict';
  13.  
  14. function EventMerger(key_function, clean_up_function) {
  15. this.makeKey = key_function;
  16. this.cleanUp = clean_up_function;
  17. }
  18.  
  19. EventMerger.prototype = {
  20. getEventSets: function ($events) {
  21. var event_sets = {},
  22. makeKey = this.makeKey;
  23. $events.each(function () {
  24. var $event = $(this),
  25. key = makeKey($event).replace(/\s/g, '');
  26. event_sets[key] = event_sets[key] || [];
  27. event_sets[key].push($event);
  28. });
  29. return event_sets;
  30. },
  31. makeAltTextColors: function ($element, colors) {
  32. $element.prepend(" ");
  33. $.each(colors.reverse(), function (i, color) {
  34. $element.prepend($("<span>")
  35. .css({
  36. 'background-color': color,
  37. 'width': '4px',
  38. 'height': '12px',
  39. 'display': 'inline-block'
  40. }));
  41. });
  42. },
  43. makeStripes: function ($element, colors) {
  44. var gradient = "repeating-linear-gradient( 45deg,",
  45. pos = 0;
  46. $.each(colors, function (i, color) {
  47. gradient += color + " " + pos + "px,";
  48. pos += 10;
  49. gradient += color + " " + pos + "px,";
  50. });
  51. gradient = gradient.slice(0, -1);
  52. gradient += ")";
  53. $element.css('background-image', gradient);
  54. },
  55. mergeEvents: function (name, event_set) {
  56. if (event_set.length > 1) {
  57.  
  58. var background = $(event_set[0]).css('background-color');
  59. // If the background is trasparent, use the text color
  60. var style_type = background.indexOf("rgba") == -1 ?
  61. 'background-color' : 'color';
  62.  
  63. var colors = $.map(event_set, function (event) {
  64. return $(event).css(style_type);
  65. });
  66.  
  67. var keep = event_set.shift();
  68. $(event_set).each(function () {
  69. $(this).parent().remove();
  70. });
  71.  
  72. if (style_type == 'background-color') {
  73. this.makeStripes(keep, colors);
  74. } else {
  75. this.makeAltTextColors(keep, colors);
  76. }
  77. this.cleanUp && this.cleanUp(keep);
  78. }
  79. },
  80. mergeSets: function ($events) {
  81. var sets = this.getEventSets($events);
  82. $.each(sets, $.proxy(this.mergeEvents, this));
  83. }
  84. };
  85.  
  86. /*****************************************************************************/
  87.  
  88. // merge timed events in week view
  89.  
  90. function weekTimedEventKey($event) {
  91. var event_name = $event.find('dd span').text(),
  92. event_time = $event.find('dt').text(),
  93. col = $event.parents('.tg-col-eventwrapper').attr('id');
  94. return event_name + event_time + col;
  95. }
  96.  
  97. function tableEventKey($event) {
  98. var event_name = $event.text(),
  99. $td = $event.parents('td'),
  100. days = $td.attr("colspan") || 1,
  101. col = $td.position().left;
  102. return event_name + ":" + col + ":" + days;
  103. }
  104.  
  105. function monthAllDayEventKey($event) {
  106. var row = $event.parents('.month-row').index();
  107.  
  108. return tableEventKey($event) + ":" + row;
  109. }
  110.  
  111. function monthTimedEventKey($event) {
  112. var time = $event.find('.te-t').text();
  113. return monthAllDayEventKey($event) + time;
  114. }
  115.  
  116. function cleanUp($event) {
  117. var chip = $event.parents('.chip'),
  118. left = Number(chip[0].style.left.replace(/%/g, ''));
  119. chip.css('width', 100 - (isNaN(left) ? 0 : left) + "%");
  120. }
  121.  
  122. var weekTimed = new EventMerger(weekTimedEventKey, cleanUp),
  123. weekAllDay = new EventMerger(tableEventKey),
  124. monthTimed = new EventMerger(monthTimedEventKey),
  125. monthAllDay = new EventMerger(monthAllDayEventKey);
  126.  
  127. var merging_main = false;
  128. $(document).on("DOMNodeInserted", "#gridcontainer", function () {
  129. if (!merging_main) {
  130. merging_main = true;
  131. var grid_container = $(this);
  132. weekTimed.mergeSets(grid_container.find('dl'));
  133. weekAllDay.mergeSets(grid_container.find(".wk-weektop .rb-n"));
  134. monthTimed.mergeSets(grid_container.find(".te"));
  135. monthAllDay.mergeSets(grid_container.find(".mv-event-container .rb-n"));
  136. merging_main = false;
  137. }
  138. });
  139.  
  140. var merging_find_time = false;
  141. $(document).on("DOMNodeInserted", "#scTgTable", function (e) {
  142. if (!merging_find_time) {
  143. merging_find_time = true;
  144. var find_time_container = $(this);
  145. weekTimed.mergeSets(find_time_container.find('dl'));
  146. weekAllDay.mergeSets(find_time_container.find(".rb-n"));
  147. merging_find_time = false;
  148. }
  149. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址