ᴜɴᴋɴᴡᴏɴ 4 лет назад
Родитель
Сommit
af0cfe112b
4 измененных файлов с 1625 добавлено и 1327 удалено
  1. 1 1
      go.mod
  2. 5 5
      internal/assets/public/public_gen.go
  3. 1 1
      internal/cmd/web.go
  4. 1618 1320
      public/js/gogs.js

+ 1 - 1
go.mod

@@ -62,7 +62,7 @@ require (
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
-	gopkg.in/ini.v1 v1.53.0
+	gopkg.in/ini.v1 v1.54.0
 	gopkg.in/ldap.v2 v2.5.1
 	gopkg.in/macaron.v1 v1.3.5
 	unknwon.dev/clog/v2 v2.1.2

Разница между файлами не показана из-за своего большого размера
+ 5 - 5
internal/assets/public/public_gen.go


+ 1 - 1
internal/cmd/web.go

@@ -154,7 +154,7 @@ func newMacaron() *macaron.Macaron {
 	}))
 	m.Use(csrf.Csrfer(csrf.Options{
 		Secret:         conf.Security.SecretKey,
-		Header:         "X-Csrf-Token",
+		Header:         "X-CSRF-Token",
 		Cookie:         conf.Session.CSRFCookieName,
 		CookieDomain:   conf.Server.URL.Hostname(),
 		CookiePath:     conf.Server.Subpath,

+ 1618 - 1320
public/js/gogs.js

@@ -1,1498 +1,1796 @@
-'use strict';
+"use strict";
 
 var csrf;
 var suburl;
 
 function initCommentPreviewTab($form) {
-    var $tabMenu = $form.find('.tabular.menu');
-    $tabMenu.find('.item').tab();
-    $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]').click(function () {
-        var $this = $(this);
-        $.post($this.data('url'), {
-            "_csrf": csrf,
-            "mode": "gfm",
-            "context": $this.data('context'),
-            "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
+  var $tabMenu = $form.find(".tabular.menu");
+  $tabMenu.find(".item").tab();
+  $tabMenu
+    .find('.item[data-tab="' + $tabMenu.data("preview") + '"]')
+    .click(function() {
+      var $this = $(this);
+      $.post(
+        $this.data("url"),
+        {
+          _csrf: csrf,
+          mode: "gfm",
+          context: $this.data("context"),
+          text: $form
+            .find(
+              '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea'
+            )
+            .val()
         },
-            function (data) {
-                var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]');
-                $previewPanel.html(data);
-                emojify.run($previewPanel[0]);
-                $('pre code', $previewPanel[0]).each(function (i, block) {
-                    hljs.highlightBlock(block);
-                });
-            }
-        );
+        function(data) {
+          var $previewPanel = $form.find(
+            '.tab.segment[data-tab="' + $tabMenu.data("preview") + '"]'
+          );
+          $previewPanel.html(data);
+          emojify.run($previewPanel[0]);
+          $("pre code", $previewPanel[0]).each(function(i, block) {
+            hljs.highlightBlock(block);
+          });
+        }
+      );
     });
 
-    buttonsClickOnEnter();
+  buttonsClickOnEnter();
 }
 
 var previewFileModes;
 
 function initEditPreviewTab($form) {
-    var $tabMenu = $form.find('.tabular.menu');
-    $tabMenu.find('.item').tab();
-    var $previewTab = $tabMenu.find('.item[data-tab="' + $tabMenu.data('preview') + '"]');
-    if ($previewTab.length) {
-        previewFileModes = $previewTab.data('preview-file-modes').split(',');
-        $previewTab.click(function () {
-            var $this = $(this);
-            $.post($this.data('url'), {
-                "_csrf": csrf,
-                "context": $this.data('context'),
-                "text": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
-            },
-                function (data) {
-                    var $previewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('preview') + '"]');
-                    $previewPanel.html(data);
-                    emojify.run($previewPanel[0]);
-                    $('pre code', $previewPanel[0]).each(function (i, block) {
-                        hljs.highlightBlock(block);
-                    });
-                }
-            );
-        });
-    }
+  var $tabMenu = $form.find(".tabular.menu");
+  $tabMenu.find(".item").tab();
+  var $previewTab = $tabMenu.find(
+    '.item[data-tab="' + $tabMenu.data("preview") + '"]'
+  );
+  if ($previewTab.length) {
+    previewFileModes = $previewTab.data("preview-file-modes").split(",");
+    $previewTab.click(function() {
+      var $this = $(this);
+      $.post(
+        $this.data("url"),
+        {
+          _csrf: csrf,
+          context: $this.data("context"),
+          text: $form
+            .find(
+              '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea'
+            )
+            .val()
+        },
+        function(data) {
+          var $previewPanel = $form.find(
+            '.tab.segment[data-tab="' + $tabMenu.data("preview") + '"]'
+          );
+          $previewPanel.html(data);
+          emojify.run($previewPanel[0]);
+          $("pre code", $previewPanel[0]).each(function(i, block) {
+            hljs.highlightBlock(block);
+          });
+        }
+      );
+    });
+  }
 }
 
 function initEditDiffTab($form) {
-    var $tabMenu = $form.find('.tabular.menu');
-    $tabMenu.find('.item').tab();
-    $tabMenu.find('.item[data-tab="' + $tabMenu.data('diff') + '"]').click(function () {
-        var $this = $(this);
-        $.post($this.data('url'), {
-            "_csrf": csrf,
-            "content": $form.find('.tab.segment[data-tab="' + $tabMenu.data('write') + '"] textarea').val()
+  var $tabMenu = $form.find(".tabular.menu");
+  $tabMenu.find(".item").tab();
+  $tabMenu
+    .find('.item[data-tab="' + $tabMenu.data("diff") + '"]')
+    .click(function() {
+      var $this = $(this);
+      $.post(
+        $this.data("url"),
+        {
+          _csrf: csrf,
+          content: $form
+            .find(
+              '.tab.segment[data-tab="' + $tabMenu.data("write") + '"] textarea'
+            )
+            .val()
         },
-            function (data) {
-                var $diffPreviewPanel = $form.find('.tab.segment[data-tab="' + $tabMenu.data('diff') + '"]');
-                $diffPreviewPanel.html(data);
-                emojify.run($diffPreviewPanel[0]);
-            }
-        );
+        function(data) {
+          var $diffPreviewPanel = $form.find(
+            '.tab.segment[data-tab="' + $tabMenu.data("diff") + '"]'
+          );
+          $diffPreviewPanel.html(data);
+          emojify.run($diffPreviewPanel[0]);
+        }
+      );
     });
 }
 
-
 function initEditForm() {
-    if ($('.edit.form').length == 0) {
-        return;
-    }
+  if ($(".edit.form").length == 0) {
+    return;
+  }
 
-    initEditPreviewTab($('.edit.form'));
-    initEditDiffTab($('.edit.form'));
+  initEditPreviewTab($(".edit.form"));
+  initEditDiffTab($(".edit.form"));
 }
 
-
 function initCommentForm() {
-    if ($('.comment.form').length == 0) {
-        return
-    }
-
-    initCommentPreviewTab($('.comment.form'));
-
-    // Labels
-    var $list = $('.ui.labels.list');
-    var $noSelect = $list.find('.no-select');
-    var $labelMenu = $('.select-label .menu');
-    var hasLabelUpdateAction = $labelMenu.data('action') == 'update';
-
-    function updateIssueMeta(url, action, id) {
-        $.post(url, {
-            "_csrf": csrf,
-            "action": action,
-            "id": id
-        });
+  if ($(".comment.form").length == 0) {
+    return;
+  }
+
+  initCommentPreviewTab($(".comment.form"));
+
+  // Labels
+  var $list = $(".ui.labels.list");
+  var $noSelect = $list.find(".no-select");
+  var $labelMenu = $(".select-label .menu");
+  var hasLabelUpdateAction = $labelMenu.data("action") == "update";
+
+  function updateIssueMeta(url, action, id) {
+    $.post(url, {
+      _csrf: csrf,
+      action: action,
+      id: id
+    });
+  }
+
+  // Add   to each unselected label to keep UI looks good.
+  // This should be added directly to HTML but somehow just get empty <span> on this page.
+  $labelMenu
+    .find(".item:not(.no-select) .octicon:not(.octicon-check)")
+    .each(function() {
+      $(this).html("&nbsp;");
+    });
+  $labelMenu.find(".item:not(.no-select)").click(function() {
+    if ($(this).hasClass("checked")) {
+      $(this).removeClass("checked");
+      $(this)
+        .find(".octicon")
+        .removeClass("octicon-check")
+        .html("&nbsp;");
+      if (hasLabelUpdateAction) {
+        updateIssueMeta(
+          $labelMenu.data("update-url"),
+          "detach",
+          $(this).data("id")
+        );
+      }
+    } else {
+      $(this).addClass("checked");
+      $(this)
+        .find(".octicon")
+        .addClass("octicon-check")
+        .html("");
+      if (hasLabelUpdateAction) {
+        updateIssueMeta(
+          $labelMenu.data("update-url"),
+          "attach",
+          $(this).data("id")
+        );
+      }
     }
 
-    // Add &nbsp; to each unselected label to keep UI looks good.
-    // This should be added directly to HTML but somehow just get empty <span> on this page.
-    $labelMenu.find('.item:not(.no-select) .octicon:not(.octicon-check)').each(function () {
-        $(this).html('&nbsp;');
-    });
-    $labelMenu.find('.item:not(.no-select)').click(function () {
-        if ($(this).hasClass('checked')) {
-            $(this).removeClass('checked');
-            $(this).find('.octicon').removeClass('octicon-check').html('&nbsp;');
-            if (hasLabelUpdateAction) {
-                updateIssueMeta($labelMenu.data('update-url'), "detach", $(this).data('id'));
-            }
+    var labelIds = "";
+    $(this)
+      .parent()
+      .find(".item")
+      .each(function() {
+        if ($(this).hasClass("checked")) {
+          labelIds += $(this).data("id") + ",";
+          $($(this).data("id-selector")).removeClass("hide");
         } else {
-            $(this).addClass('checked');
-            $(this).find('.octicon').addClass('octicon-check').html('');
-            if (hasLabelUpdateAction) {
-                updateIssueMeta($labelMenu.data('update-url'), "attach", $(this).data('id'));
-            }
+          $($(this).data("id-selector")).addClass("hide");
         }
+      });
+    if (labelIds.length == 0) {
+      $noSelect.removeClass("hide");
+    } else {
+      $noSelect.addClass("hide");
+    }
+    $(
+      $(this)
+        .parent()
+        .data("id")
+    ).val(labelIds);
+    return false;
+  });
+  $labelMenu.find(".no-select.item").click(function() {
+    if (hasLabelUpdateAction) {
+      updateIssueMeta($labelMenu.data("update-url"), "clear", "");
+    }
 
-        var labelIds = "";
-        $(this).parent().find('.item').each(function () {
-            if ($(this).hasClass('checked')) {
-                labelIds += $(this).data('id') + ",";
-                $($(this).data('id-selector')).removeClass('hide');
-            } else {
-                $($(this).data('id-selector')).addClass('hide');
-            }
-        });
-        if (labelIds.length == 0) {
-            $noSelect.removeClass('hide');
-        } else {
-            $noSelect.addClass('hide');
-        }
-        $($(this).parent().data('id')).val(labelIds);
-        return false;
+    $(this)
+      .parent()
+      .find(".item")
+      .each(function() {
+        $(this).removeClass("checked");
+        $(this)
+          .find(".octicon")
+          .removeClass("octicon-check")
+          .html("&nbsp;");
+      });
+
+    $list.find(".item").each(function() {
+      $(this).addClass("hide");
     });
-    $labelMenu.find('.no-select.item').click(function () {
-        if (hasLabelUpdateAction) {
-            updateIssueMeta($labelMenu.data('update-url'), "clear", '');
-        }
-
-        $(this).parent().find('.item').each(function () {
-            $(this).removeClass('checked');
-            $(this).find('.octicon').removeClass('octicon-check').html('&nbsp;');
+    $noSelect.removeClass("hide");
+    $(
+      $(this)
+        .parent()
+        .data("id")
+    ).val("");
+  });
+
+  function selectItem(select_id, input_id) {
+    var $menu = $(select_id + " .menu");
+    var $list = $(".ui" + select_id + ".list");
+    var hasUpdateAction = $menu.data("action") == "update";
+
+    $menu.find(".item:not(.no-select)").click(function() {
+      $(this)
+        .parent()
+        .find(".item")
+        .each(function() {
+          $(this).removeClass("selected active");
         });
 
-        $list.find('.item').each(function () {
-            $(this).addClass('hide');
-        });
-        $noSelect.removeClass('hide');
-        $($(this).parent().data('id')).val('');
+      $(this).addClass("selected active");
+      if (hasUpdateAction) {
+        updateIssueMeta($menu.data("update-url"), "", $(this).data("id"));
+      }
+      switch (input_id) {
+        case "#milestone_id":
+          $list
+            .find(".selected")
+            .html(
+              '<a class="item" href=' +
+                $(this).data("href") +
+                ">" +
+                $(this).text() +
+                "</a>"
+            );
+          break;
+        case "#assignee_id":
+          $list
+            .find(".selected")
+            .html(
+              '<a class="item" href=' +
+                $(this).data("href") +
+                ">" +
+                '<img class="ui avatar image" src=' +
+                $(this).data("avatar") +
+                ">" +
+                $(this).text() +
+                "</a>"
+            );
+      }
+      $(".ui" + select_id + ".list .no-select").addClass("hide");
+      $(input_id).val($(this).data("id"));
     });
-
-    function selectItem(select_id, input_id) {
-        var $menu = $(select_id + ' .menu');
-        var $list = $('.ui' + select_id + '.list');
-        var hasUpdateAction = $menu.data('action') == 'update';
-
-        $menu.find('.item:not(.no-select)').click(function () {
-            $(this).parent().find('.item').each(function () {
-                $(this).removeClass('selected active')
-            });
-
-            $(this).addClass('selected active');
-            if (hasUpdateAction) {
-                updateIssueMeta($menu.data('update-url'), '', $(this).data('id'));
-            }
-            switch (input_id) {
-                case '#milestone_id':
-                    $list.find('.selected').html('<a class="item" href=' + $(this).data('href') + '>' +
-                        $(this).text() + '</a>');
-                    break;
-                case '#assignee_id':
-                    $list.find('.selected').html('<a class="item" href=' + $(this).data('href') + '>' +
-                        '<img class="ui avatar image" src=' + $(this).data('avatar') + '>' +
-                        $(this).text() + '</a>');
-            }
-            $('.ui' + select_id + '.list .no-select').addClass('hide');
-            $(input_id).val($(this).data('id'));
+    $menu.find(".no-select.item").click(function() {
+      $(this)
+        .parent()
+        .find(".item:not(.no-select)")
+        .each(function() {
+          $(this).removeClass("selected active");
         });
-        $menu.find('.no-select.item').click(function () {
-            $(this).parent().find('.item:not(.no-select)').each(function () {
-                $(this).removeClass('selected active')
-            });
 
-            if (hasUpdateAction) {
-                updateIssueMeta($menu.data('update-url'), '', '');
-            }
+      if (hasUpdateAction) {
+        updateIssueMeta($menu.data("update-url"), "", "");
+      }
 
-            $list.find('.selected').html('');
-            $list.find('.no-select').removeClass('hide');
-            $(input_id).val('');
-        });
-    }
+      $list.find(".selected").html("");
+      $list.find(".no-select").removeClass("hide");
+      $(input_id).val("");
+    });
+  }
 
-    // Milestone and assignee
-    selectItem('.select-milestone', '#milestone_id');
-    selectItem('.select-assignee', '#assignee_id');
+  // Milestone and assignee
+  selectItem(".select-milestone", "#milestone_id");
+  selectItem(".select-assignee", "#assignee_id");
 }
 
 function initRepository() {
-    if ($('.repository').length == 0) {
-        return;
-    }
-
-    function initFilterSearchDropdown(selector) {
-        var $dropdown = $(selector);
-        $dropdown.dropdown({
-            fullTextSearch: true,
-            onChange: function (text, value, $choice) {
-                window.location.href = $choice.data('url');
-                console.log($choice.data('url'))
-            },
-            message: { noResults: $dropdown.data('no-results') }
-        });
-    }
-
-    // File list and commits
-    if ($('.repository.file.list').length > 0 ||
-        ('.repository.commits').length > 0) {
-        initFilterSearchDropdown('.choose.reference .dropdown');
-
-        $('.reference.column').click(function () {
-            $('.choose.reference .scrolling.menu').css('display', 'none');
-            $('.choose.reference .text').removeClass('black');
-            $($(this).data('target')).css('display', 'block');
-            $(this).find('.text').addClass('black');
-            return false;
-        });
-    }
-
-    // Wiki
-    if ($('.repository.wiki.view').length > 0) {
-        initFilterSearchDropdown('.choose.page .dropdown');
-    }
-
-    // Options
-    if ($('.repository.settings.options').length > 0) {
-        $('#repo_name').keyup(function () {
-            var $prompt = $('#repo-name-change-prompt');
-            if ($(this).val().toString().toLowerCase() != $(this).data('repo-name').toString().toLowerCase()) {
-                $prompt.show();
-            } else {
-                $prompt.hide();
-            }
-        });
-    }
-
-    // Branches
-    if ($('.repository.settings.branches').length > 0) {
-        initFilterSearchDropdown('.protected-branches .dropdown');
-        $('.enable-protection, .enable-whitelist').change(function () {
-            if (this.checked) {
-                $($(this).data('target')).removeClass('disabled');
-            } else {
-                $($(this).data('target')).addClass('disabled');
-            }
-        });
-    }
-
-    // Labels
-    if ($('.repository.labels').length > 0) {
-        // Create label
-        var $newLabelPanel = $('.new-label.segment');
-        $('.new-label.button').click(function () {
-            $newLabelPanel.show();
-        });
-        $('.new-label.segment .cancel').click(function () {
-            $newLabelPanel.hide();
-        });
-
-        $('.color-picker').each(function () {
-            $(this).minicolors();
-        });
-        $('.precolors .color').click(function () {
-            var color_hex = $(this).data('color-hex');
-            $('.color-picker').val(color_hex);
-            $('.minicolors-swatch-color').css("background-color", color_hex);
-        });
-        $('.edit-label-button').click(function () {
-            $('#label-modal-id').val($(this).data('id'));
-            $('.edit-label .new-label-input').val($(this).data('title'));
-            $('.edit-label .color-picker').val($(this).data('color'));
-            $('.minicolors-swatch-color').css("background-color", $(this).data('color'));
-            $('.edit-label.modal').modal({
-                onApprove: function () {
-                    $('.edit-label.form').submit();
-                }
-            }).modal('show');
-            return false;
-        });
-    }
+  if ($(".repository").length == 0) {
+    return;
+  }
+
+  function initFilterSearchDropdown(selector) {
+    var $dropdown = $(selector);
+    $dropdown.dropdown({
+      fullTextSearch: true,
+      onChange: function(text, value, $choice) {
+        window.location.href = $choice.data("url");
+        console.log($choice.data("url"));
+      },
+      message: { noResults: $dropdown.data("no-results") }
+    });
+  }
+
+  // File list and commits
+  if (
+    $(".repository.file.list").length > 0 ||
+    ".repository.commits".length > 0
+  ) {
+    initFilterSearchDropdown(".choose.reference .dropdown");
+
+    $(".reference.column").click(function() {
+      $(".choose.reference .scrolling.menu").css("display", "none");
+      $(".choose.reference .text").removeClass("black");
+      $($(this).data("target")).css("display", "block");
+      $(this)
+        .find(".text")
+        .addClass("black");
+      return false;
+    });
+  }
+
+  // Wiki
+  if ($(".repository.wiki.view").length > 0) {
+    initFilterSearchDropdown(".choose.page .dropdown");
+  }
+
+  // Options
+  if ($(".repository.settings.options").length > 0) {
+    $("#repo_name").keyup(function() {
+      var $prompt = $("#repo-name-change-prompt");
+      if (
+        $(this)
+          .val()
+          .toString()
+          .toLowerCase() !=
+        $(this)
+          .data("repo-name")
+          .toString()
+          .toLowerCase()
+      ) {
+        $prompt.show();
+      } else {
+        $prompt.hide();
+      }
+    });
+  }
+
+  // Branches
+  if ($(".repository.settings.branches").length > 0) {
+    initFilterSearchDropdown(".protected-branches .dropdown");
+    $(".enable-protection, .enable-whitelist").change(function() {
+      if (this.checked) {
+        $($(this).data("target")).removeClass("disabled");
+      } else {
+        $($(this).data("target")).addClass("disabled");
+      }
+    });
+  }
+
+  // Labels
+  if ($(".repository.labels").length > 0) {
+    // Create label
+    var $newLabelPanel = $(".new-label.segment");
+    $(".new-label.button").click(function() {
+      $newLabelPanel.show();
+    });
+    $(".new-label.segment .cancel").click(function() {
+      $newLabelPanel.hide();
+    });
 
-    // Milestones
-    if ($('.repository.milestones').length > 0) {
+    $(".color-picker").each(function() {
+      $(this).minicolors();
+    });
+    $(".precolors .color").click(function() {
+      var color_hex = $(this).data("color-hex");
+      $(".color-picker").val(color_hex);
+      $(".minicolors-swatch-color").css("background-color", color_hex);
+    });
+    $(".edit-label-button").click(function() {
+      $("#label-modal-id").val($(this).data("id"));
+      $(".edit-label .new-label-input").val($(this).data("title"));
+      $(".edit-label .color-picker").val($(this).data("color"));
+      $(".minicolors-swatch-color").css(
+        "background-color",
+        $(this).data("color")
+      );
+      $(".edit-label.modal")
+        .modal({
+          onApprove: function() {
+            $(".edit-label.form").submit();
+          }
+        })
+        .modal("show");
+      return false;
+    });
+  }
+
+  // Milestones
+  if ($(".repository.milestones").length > 0) {
+  }
+  if ($(".repository.new.milestone").length > 0) {
+    var $datepicker = $(".milestone.datepicker");
+    $datepicker.datetimepicker({
+      lang: $datepicker.data("lang"),
+      inline: true,
+      timepicker: false,
+      startDate: $datepicker.data("start-date"),
+      formatDate: "Y-m-d",
+      onSelectDate: function(ct) {
+        $("#deadline").val(ct.dateFormat("Y-m-d"));
+      }
+    });
+    $("#clear-date").click(function() {
+      $("#deadline").val("");
+      return false;
+    });
+  }
+
+  // Issues
+  if ($(".repository.view.issue").length > 0) {
+    // Edit issue title
+    var $issueTitle = $("#issue-title");
+    var $editInput = $("#edit-title-input").find("input");
+    var editTitleToggle = function() {
+      $issueTitle.toggle();
+      $(".not-in-edit").toggle();
+      $("#edit-title-input").toggle();
+      $(".in-edit").toggle();
+      $editInput.focus();
+      return false;
+    };
+    $("#edit-title").click(editTitleToggle);
+    $("#cancel-edit-title").click(editTitleToggle);
+    $("#save-edit-title")
+      .click(editTitleToggle)
+      .click(function() {
+        if (
+          $editInput.val().length == 0 ||
+          $editInput.val() == $issueTitle.text()
+        ) {
+          $editInput.val($issueTitle.text());
+          return false;
+        }
 
-    }
-    if ($('.repository.new.milestone').length > 0) {
-        var $datepicker = $('.milestone.datepicker');
-        $datepicker.datetimepicker({
-            lang: $datepicker.data('lang'),
-            inline: true,
-            timepicker: false,
-            startDate: $datepicker.data('start-date'),
-            formatDate: 'Y-m-d',
-            onSelectDate: function (ct) {
-                $('#deadline').val(ct.dateFormat('Y-m-d'));
-            }
-        });
-        $('#clear-date').click(function () {
-            $('#deadline').val('');
-            return false;
+        $.post(
+          $(this).data("update-url"),
+          {
+            _csrf: csrf,
+            title: $editInput.val()
+          },
+          function(data) {
+            $editInput.val(data.title);
+            $issueTitle.text(data.title);
+          }
+        );
+        return false;
+      });
+
+    // Edit issue or comment content
+    $(".edit-content").click(function() {
+      var $segment = $(this)
+        .parent()
+        .parent()
+        .parent()
+        .next();
+      var $editContentZone = $segment.find(".edit-content-zone");
+      var $renderContent = $segment.find(".render-content");
+      var $rawContent = $segment.find(".raw-content");
+      var $textarea;
+
+      // Setup new form
+      if ($editContentZone.html().length == 0) {
+        $editContentZone.html($("#edit-content-form").html());
+        $textarea = $segment.find("textarea");
+
+        // Give new write/preview data-tab name to distinguish from others
+        var $editContentForm = $editContentZone.find(".ui.comment.form");
+        var $tabMenu = $editContentForm.find(".tabular.menu");
+        $tabMenu.attr("data-write", $editContentZone.data("write"));
+        $tabMenu.attr("data-preview", $editContentZone.data("preview"));
+        $tabMenu
+          .find(".write.item")
+          .attr("data-tab", $editContentZone.data("write"));
+        $tabMenu
+          .find(".preview.item")
+          .attr("data-tab", $editContentZone.data("preview"));
+        $editContentForm
+          .find(".write.segment")
+          .attr("data-tab", $editContentZone.data("write"));
+        $editContentForm
+          .find(".preview.segment")
+          .attr("data-tab", $editContentZone.data("preview"));
+
+        initCommentPreviewTab($editContentForm);
+
+        $editContentZone.find(".cancel.button").click(function() {
+          $renderContent.show();
+          $editContentZone.hide();
         });
-    }
-
-    // Issues
-    if ($('.repository.view.issue').length > 0) {
-        // Edit issue title
-        var $issueTitle = $('#issue-title');
-        var $editInput = $('#edit-title-input').find('input');
-        var editTitleToggle = function () {
-            $issueTitle.toggle();
-            $('.not-in-edit').toggle();
-            $('#edit-title-input').toggle();
-            $('.in-edit').toggle();
-            $editInput.focus();
-            return false;
-        };
-        $('#edit-title').click(editTitleToggle);
-        $('#cancel-edit-title').click(editTitleToggle);
-        $('#save-edit-title').click(editTitleToggle).click(function () {
-            if ($editInput.val().length == 0 ||
-                $editInput.val() == $issueTitle.text()) {
-                $editInput.val($issueTitle.text());
-                return false;
-            }
-
-            $.post($(this).data('update-url'), {
-                "_csrf": csrf,
-                "title": $editInput.val()
+        $editContentZone.find(".save.button").click(function() {
+          $renderContent.show();
+          $editContentZone.hide();
+
+          $.post(
+            $editContentZone.data("update-url"),
+            {
+              _csrf: csrf,
+              content: $textarea.val(),
+              context: $editContentZone.data("context")
             },
-                function (data) {
-                    $editInput.val(data.title);
-                    $issueTitle.text(data.title);
+            function(data) {
+              if (data.length == 0) {
+                $renderContent.html($("#no-content").html());
+              } else {
+                $renderContent.html(data.content);
+                emojify.run($renderContent[0]);
+                $("pre code", $renderContent[0]).each(function(i, block) {
+                  hljs.highlightBlock(block);
                 });
-            return false;
-        });
-
-        // Edit issue or comment content
-        $('.edit-content').click(function () {
-            var $segment = $(this).parent().parent().parent().next();
-            var $editContentZone = $segment.find('.edit-content-zone');
-            var $renderContent = $segment.find('.render-content');
-            var $rawContent = $segment.find('.raw-content');
-            var $textarea;
-
-            // Setup new form
-            if ($editContentZone.html().length == 0) {
-                $editContentZone.html($('#edit-content-form').html());
-                $textarea = $segment.find('textarea');
-
-                // Give new write/preview data-tab name to distinguish from others
-                var $editContentForm = $editContentZone.find('.ui.comment.form');
-                var $tabMenu = $editContentForm.find('.tabular.menu');
-                $tabMenu.attr('data-write', $editContentZone.data('write'));
-                $tabMenu.attr('data-preview', $editContentZone.data('preview'));
-                $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write'));
-                $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview'));
-                $editContentForm.find('.write.segment').attr('data-tab', $editContentZone.data('write'));
-                $editContentForm.find('.preview.segment').attr('data-tab', $editContentZone.data('preview'));
-
-                initCommentPreviewTab($editContentForm);
-
-                $editContentZone.find('.cancel.button').click(function () {
-                    $renderContent.show();
-                    $editContentZone.hide();
-                });
-                $editContentZone.find('.save.button').click(function () {
-                    $renderContent.show();
-                    $editContentZone.hide();
-
-                    $.post($editContentZone.data('update-url'), {
-                        "_csrf": csrf,
-                        "content": $textarea.val(),
-                        "context": $editContentZone.data('context')
-                    },
-                        function (data) {
-                            if (data.length == 0) {
-                                $renderContent.html($('#no-content').html());
-                            } else {
-                                $renderContent.html(data.content);
-                                emojify.run($renderContent[0]);
-                                $('pre code', $renderContent[0]).each(function (i, block) {
-                                    hljs.highlightBlock(block);
-                                });
-                            }
-                        });
-                });
-            } else {
-                $textarea = $segment.find('textarea');
-            }
-
-            // Show write/preview tab and copy raw content as needed
-            $editContentZone.show();
-            $renderContent.hide();
-            if ($textarea.val().length == 0) {
-                $textarea.val($rawContent.text());
-            }
-            $textarea.focus();
-            return false;
-        });
-
-        // Delete comment
-        $('.delete-comment').click(function () {
-            var $this = $(this);
-            if (confirm($this.data('locale'))) {
-                $.post($this.data('url'), {
-                    "_csrf": csrf
-                }).done(function () {
-                    $('#' + $this.data('comment-id')).remove();
-                });
-            }
-            return false;
-        });
-
-        // Change status
-        var $statusButton = $('#status-button');
-        $('#comment-form .edit_area').keyup(function () {
-            if ($(this).val().length == 0) {
-                $statusButton.text($statusButton.data('status'))
-            } else {
-                $statusButton.text($statusButton.data('status-and-comment'))
+              }
             }
+          );
         });
-        $statusButton.click(function () {
-            $('#status').val($statusButton.data('status-val'));
-            $('#comment-form').submit();
-        });
-    }
-
-    // Diff
-    if ($('.repository.diff').length > 0) {
-        var $counter = $('.diff-counter');
-        if ($counter.length >= 1) {
-            $counter.each(function (i, item) {
-                var $item = $(item);
-                var addLine = $item.find('span[data-line].add').data("line");
-                var delLine = $item.find('span[data-line].del').data("line");
-                var addPercent = parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine)) * 100;
-                $item.find(".bar .add").css("width", addPercent + "%");
-            });
-        }
+      } else {
+        $textarea = $segment.find("textarea");
+      }
+
+      // Show write/preview tab and copy raw content as needed
+      $editContentZone.show();
+      $renderContent.hide();
+      if ($textarea.val().length == 0) {
+        $textarea.val($rawContent.text());
+      }
+      $textarea.focus();
+      return false;
+    });
 
-        $('.diff-file-box .lines-num').click(function () {
-            if ($(this).attr('id')) {
-                window.location.href = '#' + $(this).attr('id');
-            }
+    // Delete comment
+    $(".delete-comment").click(function() {
+      var $this = $(this);
+      if (confirm($this.data("locale"))) {
+        $.post($this.data("url"), {
+          _csrf: csrf
+        }).done(function() {
+          $("#" + $this.data("comment-id")).remove();
         });
+      }
+      return false;
+    });
 
-        $(window).on('hashchange', function (e) {
-            $('.diff-file-box .lines-code.active').removeClass('active');
-            var m = window.location.hash.match(/^#diff-.+$/);
-            if (m) {
-                $(m[0]).siblings('.lines-code').addClass('active');
-            }
-        }).trigger('hashchange');
-    }
-
-    // Quick start and repository home
-    $('#repo-clone-ssh').click(function () {
-        $('.clone-url').text($(this).data('link'));
-        $('#repo-clone-url').val($(this).data('link'));
-        $(this).addClass('blue');
-        $('#repo-clone-https').removeClass('blue');
-        localStorage.setItem('repo-clone-protocol', 'ssh');
+    // Change status
+    var $statusButton = $("#status-button");
+    $("#comment-form .edit_area").keyup(function() {
+      if ($(this).val().length == 0) {
+        $statusButton.text($statusButton.data("status"));
+      } else {
+        $statusButton.text($statusButton.data("status-and-comment"));
+      }
     });
-    $('#repo-clone-https').click(function () {
-        $('.clone-url').text($(this).data('link'));
-        $('#repo-clone-url').val($(this).data('link'));
-        $(this).addClass('blue');
-        $('#repo-clone-ssh').removeClass('blue');
-        localStorage.setItem('repo-clone-protocol', 'https');
+    $statusButton.click(function() {
+      $("#status").val($statusButton.data("status-val"));
+      $("#comment-form").submit();
     });
-    $('#repo-clone-url').click(function () {
-        $(this).select();
+  }
+
+  // Diff
+  if ($(".repository.diff").length > 0) {
+    var $counter = $(".diff-counter");
+    if ($counter.length >= 1) {
+      $counter.each(function(i, item) {
+        var $item = $(item);
+        var addLine = $item.find("span[data-line].add").data("line");
+        var delLine = $item.find("span[data-line].del").data("line");
+        var addPercent =
+          (parseFloat(addLine) / (parseFloat(addLine) + parseFloat(delLine))) *
+          100;
+        $item.find(".bar .add").css("width", addPercent + "%");
+      });
+    }
+
+    $(".diff-file-box .lines-num").click(function() {
+      if ($(this).attr("id")) {
+        window.location.href = "#" + $(this).attr("id");
+      }
     });
 
-    // Pull request
-    if ($('.repository.compare.pull').length > 0) {
-        initFilterSearchDropdown('.choose.branch .dropdown');
-    }
-    if ($('.repository.view.pull').length > 0) {
-        $('.comment.merge.box input[name=merge_style]').change(function () {
-            if ($(this).val() === 'create_merge_commit') {
-                $('.commit.description.field').show();
-            } else {
-                $('.commit.description.field').hide();
-            }
-        })
-    }
+    $(window)
+      .on("hashchange", function(e) {
+        $(".diff-file-box .lines-code.active").removeClass("active");
+        var m = window.location.hash.match(/^#diff-.+$/);
+        if (m) {
+          $(m[0])
+            .siblings(".lines-code")
+            .addClass("active");
+        }
+      })
+      .trigger("hashchange");
+  }
+
+  // Quick start and repository home
+  $("#repo-clone-ssh").click(function() {
+    $(".clone-url").text($(this).data("link"));
+    $("#repo-clone-url").val($(this).data("link"));
+    $(this).addClass("blue");
+    $("#repo-clone-https").removeClass("blue");
+    localStorage.setItem("repo-clone-protocol", "ssh");
+  });
+  $("#repo-clone-https").click(function() {
+    $(".clone-url").text($(this).data("link"));
+    $("#repo-clone-url").val($(this).data("link"));
+    $(this).addClass("blue");
+    $("#repo-clone-ssh").removeClass("blue");
+    localStorage.setItem("repo-clone-protocol", "https");
+  });
+  $("#repo-clone-url").click(function() {
+    $(this).select();
+  });
+
+  // Pull request
+  if ($(".repository.compare.pull").length > 0) {
+    initFilterSearchDropdown(".choose.branch .dropdown");
+  }
+  if ($(".repository.view.pull").length > 0) {
+    $(".comment.merge.box input[name=merge_style]").change(function() {
+      if ($(this).val() === "create_merge_commit") {
+        $(".commit.description.field").show();
+      } else {
+        $(".commit.description.field").hide();
+      }
+    });
+  }
 }
 
 function initWikiForm() {
-    var $editArea = $('.repository.wiki textarea#edit_area');
-    if ($editArea.length > 0) {
-        new SimpleMDE({
-            autoDownloadFontAwesome: false,
-            element: $editArea[0],
-            forceSync: true,
-            previewRender: function (plainText, preview) { // Async method
-                setTimeout(function () {
-                    // FIXME: still send render request when return back to edit mode
-                    $.post($editArea.data('url'), {
-                        "_csrf": csrf,
-                        "mode": "gfm",
-                        "context": $editArea.data('context'),
-                        "text": plainText
-                    },
-                        function (data) {
-                            preview.innerHTML = '<div class="markdown">' + data + '</div>';
-                            emojify.run($('.editor-preview')[0]);
-                        }
-                    );
-                }, 0);
-
-                return "Loading...";
-            },
-            renderingConfig: {
-                singleLineBreaks: false
+  var $editArea = $(".repository.wiki textarea#edit_area");
+  if ($editArea.length > 0) {
+    new SimpleMDE({
+      autoDownloadFontAwesome: false,
+      element: $editArea[0],
+      forceSync: true,
+      previewRender: function(plainText, preview) {
+        // Async method
+        setTimeout(function() {
+          // FIXME: still send render request when return back to edit mode
+          $.post(
+            $editArea.data("url"),
+            {
+              _csrf: csrf,
+              mode: "gfm",
+              context: $editArea.data("context"),
+              text: plainText
             },
-            indentWithTabs: false,
-            tabSize: 4,
-            spellChecker: false,
-            toolbar: ["bold", "italic", "strikethrough", "|",
-                "heading-1", "heading-2", "heading-3", "heading-bigger", "heading-smaller", "|",
-                "code", "quote", "|",
-                "unordered-list", "ordered-list", "|",
-                "link", "image", "table", "horizontal-rule", "|",
-                "clean-block", "preview", "fullscreen"]
-        })
-    }
+            function(data) {
+              preview.innerHTML = '<div class="markdown">' + data + "</div>";
+              emojify.run($(".editor-preview")[0]);
+            }
+          );
+        }, 0);
+
+        return "Loading...";
+      },
+      renderingConfig: {
+        singleLineBreaks: false
+      },
+      indentWithTabs: false,
+      tabSize: 4,
+      spellChecker: false,
+      toolbar: [
+        "bold",
+        "italic",
+        "strikethrough",
+        "|",
+        "heading-1",
+        "heading-2",
+        "heading-3",
+        "heading-bigger",
+        "heading-smaller",
+        "|",
+        "code",
+        "quote",
+        "|",
+        "unordered-list",
+        "ordered-list",
+        "|",
+        "link",
+        "image",
+        "table",
+        "horizontal-rule",
+        "|",
+        "clean-block",
+        "preview",
+        "fullscreen"
+      ]
+    });
+  }
 }
 
 var simpleMDEditor;
 var codeMirrorEditor;
 
 // For IE
-String.prototype.endsWith = function (pattern) {
-    var d = this.length - pattern.length;
-    return d >= 0 && this.lastIndexOf(pattern) === d;
+String.prototype.endsWith = function(pattern) {
+  var d = this.length - pattern.length;
+  return d >= 0 && this.lastIndexOf(pattern) === d;
 };
 
 // Adding function to get the cursor position in a text field to jQuery object.
-(function ($, undefined) {
-    $.fn.getCursorPosition = function () {
-        var el = $(this).get(0);
-        var pos = 0;
-        if ('selectionStart' in el) {
-            pos = el.selectionStart;
-        } else if ('selection' in document) {
-            el.focus();
-            var Sel = document.selection.createRange();
-            var SelLength = document.selection.createRange().text.length;
-            Sel.moveStart('character', -el.value.length);
-            pos = Sel.text.length - SelLength;
-        }
-        return pos;
+(function($, undefined) {
+  $.fn.getCursorPosition = function() {
+    var el = $(this).get(0);
+    var pos = 0;
+    if ("selectionStart" in el) {
+      pos = el.selectionStart;
+    } else if ("selection" in document) {
+      el.focus();
+      var Sel = document.selection.createRange();
+      var SelLength = document.selection.createRange().text.length;
+      Sel.moveStart("character", -el.value.length);
+      pos = Sel.text.length - SelLength;
     }
+    return pos;
+  };
 })(jQuery);
 
-
 function setSimpleMDE($editArea) {
-    if (codeMirrorEditor) {
-        codeMirrorEditor.toTextArea();
-        codeMirrorEditor = null;
-    }
-
-    if (simpleMDEditor) {
-        return true;
-    }
-
-    simpleMDEditor = new SimpleMDE({
-        autoDownloadFontAwesome: false,
-        element: $editArea[0],
-        forceSync: true,
-        renderingConfig: {
-            singleLineBreaks: false
-        },
-        indentWithTabs: false,
-        tabSize: 4,
-        spellChecker: false,
-        previewRender: function (plainText, preview) { // Async method
-            setTimeout(function () {
-                // FIXME: still send render request when return back to edit mode
-                $.post($editArea.data('url'), {
-                    "_csrf": csrf,
-                    "mode": "gfm",
-                    "context": $editArea.data('context'),
-                    "text": plainText
-                },
-                    function (data) {
-                        preview.innerHTML = '<div class="markdown">' + data + '</div>';
-                        emojify.run($('.editor-preview')[0]);
-                    }
-                );
-            }, 0);
-
-            return "Loading...";
-        },
-        toolbar: ["bold", "italic", "strikethrough", "|",
-            "heading-1", "heading-2", "heading-3", "heading-bigger", "heading-smaller", "|",
-            "code", "quote", "|",
-            "unordered-list", "ordered-list", "|",
-            "link", "image", "table", "horizontal-rule", "|",
-            "clean-block"]
-    });
+  if (codeMirrorEditor) {
+    codeMirrorEditor.toTextArea();
+    codeMirrorEditor = null;
+  }
 
+  if (simpleMDEditor) {
     return true;
+  }
+
+  simpleMDEditor = new SimpleMDE({
+    autoDownloadFontAwesome: false,
+    element: $editArea[0],
+    forceSync: true,
+    renderingConfig: {
+      singleLineBreaks: false
+    },
+    indentWithTabs: false,
+    tabSize: 4,
+    spellChecker: false,
+    previewRender: function(plainText, preview) {
+      // Async method
+      setTimeout(function() {
+        // FIXME: still send render request when return back to edit mode
+        $.post(
+          $editArea.data("url"),
+          {
+            _csrf: csrf,
+            mode: "gfm",
+            context: $editArea.data("context"),
+            text: plainText
+          },
+          function(data) {
+            preview.innerHTML = '<div class="markdown">' + data + "</div>";
+            emojify.run($(".editor-preview")[0]);
+          }
+        );
+      }, 0);
+
+      return "Loading...";
+    },
+    toolbar: [
+      "bold",
+      "italic",
+      "strikethrough",
+      "|",
+      "heading-1",
+      "heading-2",
+      "heading-3",
+      "heading-bigger",
+      "heading-smaller",
+      "|",
+      "code",
+      "quote",
+      "|",
+      "unordered-list",
+      "ordered-list",
+      "|",
+      "link",
+      "image",
+      "table",
+      "horizontal-rule",
+      "|",
+      "clean-block"
+    ]
+  });
+
+  return true;
 }
 
 function setCodeMirror($editArea) {
-    if (simpleMDEditor) {
-        simpleMDEditor.toTextArea();
-        simpleMDEditor = null;
-    }
+  if (simpleMDEditor) {
+    simpleMDEditor.toTextArea();
+    simpleMDEditor = null;
+  }
 
-    if (codeMirrorEditor) {
-        return true;
-    }
+  if (codeMirrorEditor) {
+    return true;
+  }
 
-    codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], {
-        lineNumbers: true
-    });
-    codeMirrorEditor.on("change", function (cm, change) {
-        $editArea.val(cm.getValue());
-    });
+  codeMirrorEditor = CodeMirror.fromTextArea($editArea[0], {
+    lineNumbers: true
+  });
+  codeMirrorEditor.on("change", function(cm, change) {
+    $editArea.val(cm.getValue());
+  });
 
-    return true;
+  return true;
 }
 
 function initEditor() {
-    $('.js-quick-pull-choice-option').change(function () {
-        if ($(this).val() == 'commit-to-new-branch') {
-            $('.quick-pull-branch-name').show();
-            $('.quick-pull-branch-name input').prop('required', true);
-        } else {
-            $('.quick-pull-branch-name').hide();
-            $('.quick-pull-branch-name input').prop('required', false);
+  $(".js-quick-pull-choice-option").change(function() {
+    if ($(this).val() == "commit-to-new-branch") {
+      $(".quick-pull-branch-name").show();
+      $(".quick-pull-branch-name input").prop("required", true);
+    } else {
+      $(".quick-pull-branch-name").hide();
+      $(".quick-pull-branch-name input").prop("required", false);
+    }
+  });
+
+  var $editFilename = $("#file-name");
+  $editFilename
+    .keyup(function(e) {
+      var $section = $(".breadcrumb span.section");
+      var $divider = $(".breadcrumb div.divider");
+      if (e.keyCode == 8) {
+        if ($(this).getCursorPosition() == 0) {
+          if ($section.length > 0) {
+            var value = $section
+              .last()
+              .find("a")
+              .text();
+            $(this).val(value + $(this).val());
+            $(this)[0].setSelectionRange(value.length, value.length);
+            $section.last().remove();
+            $divider.last().remove();
+          }
         }
-    });
-
-    var $editFilename = $("#file-name");
-    $editFilename.keyup(function (e) {
-        var $section = $('.breadcrumb span.section');
-        var $divider = $('.breadcrumb div.divider');
-        if (e.keyCode == 8) {
-            if ($(this).getCursorPosition() == 0) {
-                if ($section.length > 0) {
-                    var value = $section.last().find('a').text();
-                    $(this).val(value + $(this).val());
-                    $(this)[0].setSelectionRange(value.length, value.length);
-                    $section.last().remove();
-                    $divider.last().remove();
-                }
+      }
+      if (e.keyCode == 191) {
+        var parts = $(this)
+          .val()
+          .split("/");
+        for (var i = 0; i < parts.length; ++i) {
+          var value = parts[i];
+          if (i < parts.length - 1) {
+            if (value.length) {
+              $(
+                '<span class="section"><a href="#">' + value + "</a></span>"
+              ).insertBefore($(this));
+              $('<div class="divider"> / </div>').insertBefore($(this));
             }
+          } else {
+            $(this).val(value);
+          }
+          $(this)[0].setSelectionRange(0, 0);
         }
-        if (e.keyCode == 191) {
-            var parts = $(this).val().split('/');
-            for (var i = 0; i < parts.length; ++i) {
-                var value = parts[i];
-                if (i < parts.length - 1) {
-                    if (value.length) {
-                        $('<span class="section"><a href="#">' + value + '</a></span>').insertBefore($(this));
-                        $('<div class="divider"> / </div>').insertBefore($(this));
-                    }
-                }
-                else {
-                    $(this).val(value);
-                }
-                $(this)[0].setSelectionRange(0, 0);
-            }
+      }
+      var parts = [];
+      $(".breadcrumb span.section").each(function(i, element) {
+        element = $(element);
+        if (element.find("a").length) {
+          parts.push(element.find("a").text());
+        } else {
+          parts.push(element.text());
         }
-        var parts = [];
-        $('.breadcrumb span.section').each(function (i, element) {
-            element = $(element);
-            if (element.find('a').length) {
-                parts.push(element.find('a').text());
-            } else {
-                parts.push(element.text());
-            }
-        });
-        if ($(this).val()) {
-            parts.push($(this).val());
+      });
+      if ($(this).val()) {
+        parts.push($(this).val());
+      }
+
+      var tree_path = parts.join("/");
+      $("#tree_path").val(tree_path);
+      $("#preview-tab").data(
+        "context",
+        $("#preview-tab").data("root-context") +
+          tree_path.substring(0, tree_path.lastIndexOf("/") + 1)
+      );
+    })
+    .trigger("keyup");
+
+  var $editArea = $(".repository.editor textarea#edit_area");
+  if (!$editArea.length) return;
+
+  var markdownFileExts = $editArea.data("markdown-file-exts").split(",");
+  var lineWrapExtensions = $editArea.data("line-wrap-extensions").split(",");
+
+  $editFilename
+    .on("keyup", function(e) {
+      var val = $editFilename.val(),
+        m,
+        mode,
+        spec,
+        extension,
+        extWithDot,
+        previewLink,
+        dataUrl,
+        apiCall;
+      extension = extWithDot = "";
+      if ((m = /.+\.([^.]+)$/.exec(val))) {
+        extension = m[1].toLowerCase();
+        extWithDot = "." + extension;
+      }
+
+      var info = CodeMirror.findModeByExtension(extension);
+      previewLink = $("a[data-tab=preview]");
+      if (info) {
+        mode = info.mode;
+        spec = info.mime;
+        apiCall = mode;
+      } else {
+        apiCall = extension;
+      }
+
+      if (
+        previewLink.length &&
+        apiCall &&
+        previewFileModes &&
+        previewFileModes.length &&
+        previewFileModes.indexOf(apiCall) >= 0
+      ) {
+        dataUrl = previewLink.data("url");
+        previewLink.data("url", dataUrl.replace(/(.*)\/.*/i, "$1/" + mode));
+        previewLink.show();
+      } else {
+        previewLink.hide();
+      }
+
+      // If this file is a Markdown extensions, we will load that editor and return
+      if (markdownFileExts.indexOf(extWithDot) >= 0) {
+        if (setSimpleMDE($editArea)) {
+          return;
         }
+      }
 
-        var tree_path = parts.join('/');
-        $('#tree_path').val(tree_path);
-        $('#preview-tab').data('context', $('#preview-tab').data('root-context') + tree_path.substring(0, tree_path.lastIndexOf("/") + 1));
-    }).trigger('keyup');
-
-    var $editArea = $('.repository.editor textarea#edit_area');
-    if (!$editArea.length)
+      // Else we are going to use CodeMirror
+      if (!codeMirrorEditor && !setCodeMirror($editArea)) {
         return;
-
-    var markdownFileExts = $editArea.data("markdown-file-exts").split(",");
-    var lineWrapExtensions = $editArea.data("line-wrap-extensions").split(",");
-
-    $editFilename.on("keyup", function (e) {
-        var val = $editFilename.val(), m, mode, spec, extension, extWithDot, previewLink, dataUrl, apiCall;
-        extension = extWithDot = "";
-        if (m = /.+\.([^.]+)$/.exec(val)) {
-            extension = m[1].toLowerCase();
-            extWithDot = "." + extension;
-        }
-
-        var info = CodeMirror.findModeByExtension(extension);
-        previewLink = $('a[data-tab=preview]');
-        if (info) {
-            mode = info.mode;
-            spec = info.mime;
-            apiCall = mode;
-        }
-        else {
-            apiCall = extension
-        }
-
-        if (previewLink.length && apiCall && previewFileModes && previewFileModes.length && previewFileModes.indexOf(apiCall) >= 0) {
-            dataUrl = previewLink.data('url');
-            previewLink.data('url', dataUrl.replace(/(.*)\/.*/i, '$1/' + mode));
-            previewLink.show();
-        }
-        else {
-            previewLink.hide();
-        }
-
-        // If this file is a Markdown extensions, we will load that editor and return
-        if (markdownFileExts.indexOf(extWithDot) >= 0) {
-            if (setSimpleMDE($editArea)) {
-                return;
+      }
+
+      if (mode) {
+        codeMirrorEditor.setOption("mode", spec);
+        CodeMirror.autoLoadMode(codeMirrorEditor, mode);
+      }
+
+      if (lineWrapExtensions.indexOf(extWithDot) >= 0) {
+        codeMirrorEditor.setOption("lineWrapping", true);
+      } else {
+        codeMirrorEditor.setOption("lineWrapping", false);
+      }
+
+      // get the filename without any folder
+      var value = $editFilename.val();
+      if (value.length === 0) {
+        return;
+      }
+      value = value.split("/");
+      value = value[value.length - 1];
+
+      $.getJSON($editFilename.data("ec-url-prefix") + value, function(
+        editorconfig
+      ) {
+        if (editorconfig.indent_style === "tab") {
+          codeMirrorEditor.setOption("indentWithTabs", true);
+          codeMirrorEditor.setOption("extraKeys", {});
+        } else {
+          codeMirrorEditor.setOption("indentWithTabs", false);
+          // required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}:
+          // - https://github.com/codemirror/CodeMirror/issues/988
+          // - https://codemirror.net/doc/manual.html#keymaps
+          codeMirrorEditor.setOption("extraKeys", {
+            Tab: function(cm) {
+              var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join(
+                " "
+              );
+              cm.replaceSelection(spaces);
             }
+          });
         }
-
-        // Else we are going to use CodeMirror
-        if (!codeMirrorEditor && !setCodeMirror($editArea)) {
-            return;
-        }
-
-        if (mode) {
-            codeMirrorEditor.setOption("mode", spec);
-            CodeMirror.autoLoadMode(codeMirrorEditor, mode);
-        }
-
-        if (lineWrapExtensions.indexOf(extWithDot) >= 0) {
-            codeMirrorEditor.setOption("lineWrapping", true);
-        }
-        else {
-            codeMirrorEditor.setOption("lineWrapping", false);
-        }
-
-        // get the filename without any folder
-        var value = $editFilename.val();
-        if (value.length === 0) {
-            return;
-        }
-        value = value.split('/');
-        value = value[value.length - 1];
-
-        $.getJSON($editFilename.data('ec-url-prefix') + value, function (editorconfig) {
-            if (editorconfig.indent_style === 'tab') {
-                codeMirrorEditor.setOption("indentWithTabs", true);
-                codeMirrorEditor.setOption('extraKeys', {});
-            } else {
-                codeMirrorEditor.setOption("indentWithTabs", false);
-                // required because CodeMirror doesn't seems to use spaces correctly for {"indentWithTabs": false}:
-                // - https://github.com/codemirror/CodeMirror/issues/988
-                // - https://codemirror.net/doc/manual.html#keymaps
-                codeMirrorEditor.setOption('extraKeys', {
-                    Tab: function (cm) {
-                        var spaces = Array(parseInt(cm.getOption("indentUnit")) + 1).join(" ");
-                        cm.replaceSelection(spaces);
-                    }
-                });
-            }
-            codeMirrorEditor.setOption("indentUnit", editorconfig.indent_size || 4);
-            codeMirrorEditor.setOption("tabSize", editorconfig.tab_width || 4);
-        });
-    }).trigger('keyup');
+        codeMirrorEditor.setOption("indentUnit", editorconfig.indent_size || 4);
+        codeMirrorEditor.setOption("tabSize", editorconfig.tab_width || 4);
+      });
+    })
+    .trigger("keyup");
 }
 
 function initOrganization() {
-    if ($('.organization').length == 0) {
-        return;
-    }
-
-    // Options
-    if ($('.organization.settings.options').length > 0) {
-        $('#org_name').keyup(function () {
-            var $prompt = $('#org-name-change-prompt');
-            if ($(this).val().toString().toLowerCase() != $(this).data('org-name').toString().toLowerCase()) {
-                $prompt.show();
-            } else {
-                $prompt.hide();
-            }
-        });
-    }
+  if ($(".organization").length == 0) {
+    return;
+  }
+
+  // Options
+  if ($(".organization.settings.options").length > 0) {
+    $("#org_name").keyup(function() {
+      var $prompt = $("#org-name-change-prompt");
+      if (
+        $(this)
+          .val()
+          .toString()
+          .toLowerCase() !=
+        $(this)
+          .data("org-name")
+          .toString()
+          .toLowerCase()
+      ) {
+        $prompt.show();
+      } else {
+        $prompt.hide();
+      }
+    });
+  }
 }
 
 function initAdmin() {
-    if ($('.admin').length == 0) {
-        return;
-    }
-
-    // New user
-    if ($('.admin.new.user').length > 0 ||
-        $('.admin.edit.user').length > 0) {
-        $('#login_type').change(function () {
-            if ($(this).val().substring(0, 1) == '0') {
-                $('#login_name').removeAttr('required');
-                $('.non-local').hide();
-                $('.local').show();
-                $('#user_name').focus();
-
-                if ($(this).data('password') == "required") {
-                    $('#password').attr('required', 'required');
-                }
-
-            } else {
-                $('#login_name').attr('required', 'required');
-                $('.non-local').show();
-                $('.local').hide();
-                $('#login_name').focus();
-
-                $('#password').removeAttr('required');
-            }
-        });
-    }
-
-    function onSecurityProtocolChange() {
-        if ($('#security_protocol').val() > 0) {
-            $('.has-tls').show();
-        } else {
-            $('.has-tls').hide();
+  if ($(".admin").length == 0) {
+    return;
+  }
+
+  // New user
+  if ($(".admin.new.user").length > 0 || $(".admin.edit.user").length > 0) {
+    $("#login_type").change(function() {
+      if (
+        $(this)
+          .val()
+          .substring(0, 1) == "0"
+      ) {
+        $("#login_name").removeAttr("required");
+        $(".non-local").hide();
+        $(".local").show();
+        $("#user_name").focus();
+
+        if ($(this).data("password") == "required") {
+          $("#password").attr("required", "required");
         }
-    }
-
-    // New authentication
-    if ($('.admin.new.authentication').length > 0) {
-        $('#auth_type').change(function () {
-            $('.ldap').hide();
-            $('.dldap').hide();
-            $('.smtp').hide();
-            $('.pam').hide();
-            $('.github').hide();
-            $('.has-tls').hide();
-
-            var authType = $(this).val();
-            switch (authType) {
-                case '2':     // LDAP
-                    $('.ldap').show();
-                    break;
-                case '3':     // SMTP
-                    $('.smtp').show();
-                    $('.has-tls').show();
-                    break;
-                case '4':     // PAM
-                    $('.pam').show();
-                    break;
-                case '5':     // LDAP
-                    $('.dldap').show();
-                    break;
-                case '6': //GITHUB
-                    $('.github').show();
-                      break;
-              }
+      } else {
+        $("#login_name").attr("required", "required");
+        $(".non-local").show();
+        $(".local").hide();
+        $("#login_name").focus();
+
+        $("#password").removeAttr("required");
+      }
+    });
+  }
 
-            if (authType == '2' || authType == '5') {
-                onSecurityProtocolChange()
-            }
-        });
-        $('#security_protocol').change(onSecurityProtocolChange)
+  function onSecurityProtocolChange() {
+    if ($("#security_protocol").val() > 0) {
+      $(".has-tls").show();
+    } else {
+      $(".has-tls").hide();
     }
-    // Edit authentication
-    if ($('.admin.edit.authentication').length > 0) {
-        var authType = $('#auth_type').val();
-        if (authType == '2' || authType == '5') {
-            $('#security_protocol').change(onSecurityProtocolChange);
-        }
+  }
+
+  // New authentication
+  if ($(".admin.new.authentication").length > 0) {
+    $("#auth_type").change(function() {
+      $(".ldap").hide();
+      $(".dldap").hide();
+      $(".smtp").hide();
+      $(".pam").hide();
+      $(".github").hide();
+      $(".has-tls").hide();
+
+      var authType = $(this).val();
+      switch (authType) {
+        case "2": // LDAP
+          $(".ldap").show();
+          break;
+        case "3": // SMTP
+          $(".smtp").show();
+          $(".has-tls").show();
+          break;
+        case "4": // PAM
+          $(".pam").show();
+          break;
+        case "5": // LDAP
+          $(".dldap").show();
+          break;
+        case "6": //GITHUB
+          $(".github").show();
+          break;
+      }
+
+      if (authType == "2" || authType == "5") {
+        onSecurityProtocolChange();
+      }
+    });
+    $("#security_protocol").change(onSecurityProtocolChange);
+  }
+  // Edit authentication
+  if ($(".admin.edit.authentication").length > 0) {
+    var authType = $("#auth_type").val();
+    if (authType == "2" || authType == "5") {
+      $("#security_protocol").change(onSecurityProtocolChange);
     }
+  }
 
-    // Notice
-    if ($('.admin.notice')) {
-        var $detailModal = $('#detail-modal');
+  // Notice
+  if ($(".admin.notice")) {
+    var $detailModal = $("#detail-modal");
 
-        // Attach view detail modals
-        $('.view-detail').click(function () {
-            $detailModal.find('.content p').text($(this).data('content'));
-            $detailModal.modal('show');
-            return false;
-        });
+    // Attach view detail modals
+    $(".view-detail").click(function() {
+      $detailModal.find(".content p").text($(this).data("content"));
+      $detailModal.modal("show");
+      return false;
+    });
 
-        // Select actions
-        var $checkboxes = $('.select.table .ui.checkbox');
-        $('.select.action').click(function () {
-            switch ($(this).data('action')) {
-                case 'select-all':
-                    $checkboxes.checkbox('check');
-                    break;
-                case 'deselect-all':
-                    $checkboxes.checkbox('uncheck');
-                    break;
-                case 'inverse':
-                    $checkboxes.checkbox('toggle');
-                    break;
-            }
-        });
-        $('#delete-selection').click(function () {
-            var $this = $(this);
-            $this.addClass("loading disabled");
-            var ids = [];
-            $checkboxes.each(function () {
-                if ($(this).checkbox('is checked')) {
-                    ids.push($(this).data('id'));
-                }
-            });
-            $.post($this.data('link'), {
-                "_csrf": csrf,
-                "ids": ids
-            }).done(function () {
-                window.location.href = $this.data('redirect');
-            });
-        });
-    }
+    // Select actions
+    var $checkboxes = $(".select.table .ui.checkbox");
+    $(".select.action").click(function() {
+      switch ($(this).data("action")) {
+        case "select-all":
+          $checkboxes.checkbox("check");
+          break;
+        case "deselect-all":
+          $checkboxes.checkbox("uncheck");
+          break;
+        case "inverse":
+          $checkboxes.checkbox("toggle");
+          break;
+      }
+    });
+    $("#delete-selection").click(function() {
+      var $this = $(this);
+      $this.addClass("loading disabled");
+      var ids = [];
+      $checkboxes.each(function() {
+        if ($(this).checkbox("is checked")) {
+          ids.push($(this).data("id"));
+        }
+      });
+      $.post($this.data("link"), {
+        _csrf: csrf,
+        ids: ids
+      }).done(function() {
+        window.location.href = $this.data("redirect");
+      });
+    });
+  }
 }
 
 function buttonsClickOnEnter() {
-    $('.ui.button').keypress(function (e) {
-        if (e.keyCode == 13 || e.keyCode == 32) // enter key or space bar
-            $(this).click();
-    });
+  $(".ui.button").keypress(function(e) {
+    if (e.keyCode == 13 || e.keyCode == 32)
+      // enter key or space bar
+      $(this).click();
+  });
 }
 
 function hideWhenLostFocus(body, parent) {
-    $(document).click(function (e) {
-        var target = e.target;
-        if (!$(target).is(body) && !$(target).parents().is(parent)) {
-            $(body).hide();
-        }
-    });
+  $(document).click(function(e) {
+    var target = e.target;
+    if (
+      !$(target).is(body) &&
+      !$(target)
+        .parents()
+        .is(parent)
+    ) {
+      $(body).hide();
+    }
+  });
 }
 
 function searchUsers() {
-    if (!$('#search-user-box .results').length) {
-        return;
+  if (!$("#search-user-box .results").length) {
+    return;
+  }
+
+  var $searchUserBox = $("#search-user-box");
+  var $results = $searchUserBox.find(".results");
+  $searchUserBox.keyup(function() {
+    var $this = $(this);
+    var keyword = $this.find("input").val();
+    if (keyword.length < 2) {
+      $results.hide();
+      return;
     }
 
-    var $searchUserBox = $('#search-user-box');
-    var $results = $searchUserBox.find('.results');
-    $searchUserBox.keyup(function () {
-        var $this = $(this);
-        var keyword = $this.find('input').val();
-        if (keyword.length < 2) {
-            $results.hide();
-            return;
-        }
+    $.ajax({
+      url: suburl + "/api/v1/users/search?q=" + keyword,
+      dataType: "json",
+      success: function(response) {
+        var notEmpty = function(str) {
+          return str && str.length > 0;
+        };
 
-        $.ajax({
-            url: suburl + '/api/v1/users/search?q=' + keyword,
-            dataType: "json",
-            success: function (response) {
-                var notEmpty = function (str) {
-                    return str && str.length > 0;
-                };
-
-                $results.html('');
-
-                if (response.ok && response.data.length) {
-                    var html = '';
-                    $.each(response.data, function (i, item) {
-                        html += '<div class="item"><img class="ui avatar image" src="' + item.avatar_url + '"><span class="username">' + item.username + '</span>';
-                        if (notEmpty(item.full_name)) {
-                            html += ' (' + item.full_name + ')';
-                        }
-                        html += '</div>';
-                    });
-                    $results.html(html);
-                    $this.find('.results .item').click(function () {
-                        $this.find('input').val($(this).find('.username').text());
-                        $results.hide();
-                    });
-                    $results.show();
-                } else {
-                    $results.hide();
-                }
+        $results.html("");
+
+        if (response.ok && response.data.length) {
+          var html = "";
+          $.each(response.data, function(i, item) {
+            html +=
+              '<div class="item"><img class="ui avatar image" src="' +
+              item.avatar_url +
+              '"><span class="username">' +
+              item.username +
+              "</span>";
+            if (notEmpty(item.full_name)) {
+              html += " (" + item.full_name + ")";
             }
-        });
-    });
-    $searchUserBox.find('input').focus(function () {
-        $searchUserBox.keyup();
+            html += "</div>";
+          });
+          $results.html(html);
+          $this.find(".results .item").click(function() {
+            $this.find("input").val(
+              $(this)
+                .find(".username")
+                .text()
+            );
+            $results.hide();
+          });
+          $results.show();
+        } else {
+          $results.hide();
+        }
+      }
     });
-    hideWhenLostFocus('#search-user-box .results', '#search-user-box');
+  });
+  $searchUserBox.find("input").focus(function() {
+    $searchUserBox.keyup();
+  });
+  hideWhenLostFocus("#search-user-box .results", "#search-user-box");
 }
 
 // FIXME: merge common parts in two functions
 function searchRepositories() {
-    if (!$('#search-repo-box .results').length) {
-        return;
+  if (!$("#search-repo-box .results").length) {
+    return;
+  }
+
+  var $searchRepoBox = $("#search-repo-box");
+  var $results = $searchRepoBox.find(".results");
+  $searchRepoBox.keyup(function() {
+    var $this = $(this);
+    var keyword = $this.find("input").val();
+    if (keyword.length < 2) {
+      $results.hide();
+      return;
     }
 
-    var $searchRepoBox = $('#search-repo-box');
-    var $results = $searchRepoBox.find('.results');
-    $searchRepoBox.keyup(function () {
-        var $this = $(this);
-        var keyword = $this.find('input').val();
-        if (keyword.length < 2) {
+    $.ajax({
+      url:
+        suburl +
+        "/api/v1/repos/search?q=" +
+        keyword +
+        "&uid=" +
+        $searchRepoBox.data("uid"),
+      dataType: "json",
+      success: function(response) {
+        var notEmpty = function(str) {
+          return str && str.length > 0;
+        };
+
+        $results.html("");
+
+        if (response.ok && response.data.length) {
+          var html = "";
+          $.each(response.data, function(i, item) {
+            html +=
+              '<div class="item"><i class="octicon octicon-repo"></i> <span class="fullname">' +
+              item.full_name +
+              "</span></div>";
+          });
+          $results.html(html);
+          $this.find(".results .item").click(function() {
+            $this.find("input").val(
+              $(this)
+                .find(".fullname")
+                .text()
+                .split("/")[1]
+            );
             $results.hide();
-            return;
+          });
+          $results.show();
+        } else {
+          $results.hide();
         }
-
-        $.ajax({
-            url: suburl + '/api/v1/repos/search?q=' + keyword + "&uid=" + $searchRepoBox.data('uid'),
-            dataType: "json",
-            success: function (response) {
-                var notEmpty = function (str) {
-                    return str && str.length > 0;
-                };
-
-                $results.html('');
-
-                if (response.ok && response.data.length) {
-                    var html = '';
-                    $.each(response.data, function (i, item) {
-                        html += '<div class="item"><i class="octicon octicon-repo"></i> <span class="fullname">' + item.full_name + '</span></div>';
-                    });
-                    $results.html(html);
-                    $this.find('.results .item').click(function () {
-                        $this.find('input').val($(this).find('.fullname').text().split("/")[1]);
-                        $results.hide();
-                    });
-                    $results.show();
-                } else {
-                    $results.hide();
-                }
-            }
-        });
-    });
-    $searchRepoBox.find('input').focus(function () {
-        $searchRepoBox.keyup();
+      }
     });
-    hideWhenLostFocus('#search-repo-box .results', '#search-repo-box');
+  });
+  $searchRepoBox.find("input").focus(function() {
+    $searchRepoBox.keyup();
+  });
+  hideWhenLostFocus("#search-repo-box .results", "#search-repo-box");
 }
 
 function initCodeView() {
-    if ($('.code-view .linenums').length > 0) {
-        $(document).on('click', '.lines-num span', function (e) {
-            var $select = $(this);
-            var $list = $select.parent().siblings('.lines-code').find('ol.linenums > li');
-            selectRange($list, $list.filter('[rel=' + $select.attr('id') + ']'), (e.shiftKey ? $list.filter('.active').eq(0) : null));
-            deSelect();
-        });
+  if ($(".code-view .linenums").length > 0) {
+    $(document).on("click", ".lines-num span", function(e) {
+      var $select = $(this);
+      var $list = $select
+        .parent()
+        .siblings(".lines-code")
+        .find("ol.linenums > li");
+      selectRange(
+        $list,
+        $list.filter("[rel=" + $select.attr("id") + "]"),
+        e.shiftKey ? $list.filter(".active").eq(0) : null
+      );
+      deSelect();
+    });
 
-        $(window).on('hashchange', function (e) {
-            var m = window.location.hash.match(/^#(L\d+)\-(L\d+)$/);
-            var $list = $('.code-view ol.linenums > li');
-            var $first;
-            if (m) {
-                $first = $list.filter('.' + m[1]);
-                selectRange($list, $first, $list.filter('.' + m[2]));
-                $("html, body").scrollTop($first.offset().top - 200);
-                return;
-            }
-            m = window.location.hash.match(/^#(L\d+)$/);
-            if (m) {
-                $first = $list.filter('.' + m[1]);
-                selectRange($list, $first);
-                $("html, body").scrollTop($first.offset().top - 200);
-            }
-        }).trigger('hashchange');
-    }
+    $(window)
+      .on("hashchange", function(e) {
+        var m = window.location.hash.match(/^#(L\d+)\-(L\d+)$/);
+        var $list = $(".code-view ol.linenums > li");
+        var $first;
+        if (m) {
+          $first = $list.filter("." + m[1]);
+          selectRange($list, $first, $list.filter("." + m[2]));
+          $("html, body").scrollTop($first.offset().top - 200);
+          return;
+        }
+        m = window.location.hash.match(/^#(L\d+)$/);
+        if (m) {
+          $first = $list.filter("." + m[1]);
+          selectRange($list, $first);
+          $("html, body").scrollTop($first.offset().top - 200);
+        }
+      })
+      .trigger("hashchange");
+  }
 }
 
 function initUserSettings() {
-    console.log('initUserSettings');
-
-    // Options
-    if ($('.user.settings.profile').length > 0) {
-        $('#username').keyup(function () {
-            var $prompt = $('#name-change-prompt');
-            if ($(this).val().toString().toLowerCase() != $(this).data('name').toString().toLowerCase()) {
-                $prompt.show();
-            } else {
-                $prompt.hide();
-            }
-        });
-    }
+  console.log("initUserSettings");
+
+  // Options
+  if ($(".user.settings.profile").length > 0) {
+    $("#username").keyup(function() {
+      var $prompt = $("#name-change-prompt");
+      if (
+        $(this)
+          .val()
+          .toString()
+          .toLowerCase() !=
+        $(this)
+          .data("name")
+          .toString()
+          .toLowerCase()
+      ) {
+        $prompt.show();
+      } else {
+        $prompt.hide();
+      }
+    });
+  }
 }
 
 function initRepositoryCollaboration() {
-    console.log('initRepositoryCollaboration');
-
-    // Change collaborator access mode
-    $('.access-mode.menu .item').click(function () {
-        var $menu = $(this).parent();
-        $.post($menu.data('url'), {
-            "_csrf": csrf,
-            "uid": $menu.data('uid'),
-            "mode": $(this).data('value')
-        })
+  console.log("initRepositoryCollaboration");
+
+  // Change collaborator access mode
+  $(".access-mode.menu .item").click(function() {
+    var $menu = $(this).parent();
+    $.post($menu.data("url"), {
+      _csrf: csrf,
+      uid: $menu.data("uid"),
+      mode: $(this).data("value")
     });
+  });
 }
 
 function initWebhookSettings() {
-    $('.events.checkbox input').change(function () {
-        if ($(this).is(':checked')) {
-            $('.events.fields').show();
-        }
-    });
-    $('.non-events.checkbox input').change(function () {
-        if ($(this).is(':checked')) {
-            $('.events.fields').hide();
-        }
-    });
-
-    // Highlight payload on first click
-    $('.hook.history.list .toggle.button').click(function () {
-        $($(this).data('target') + ' .nohighlight').each(function () {
-            var $this = $(this);
-            $this.removeClass('nohighlight');
-            setTimeout(function () { hljs.highlightBlock($this[0]) }, 500);
-        })
-    })
-
-    // Trigger delivery
-    $('.delivery.button, .redelivery.button').click(function () {
-        var $this = $(this);
-        $this.addClass('loading disabled');
-        $.post($this.data('link'), {
-            "_csrf": csrf
-        }).done(
-            setTimeout(function () {
-                window.location.href = $this.data('redirect');
-            }, 5000)
-        );
-    });
-}
-
-$(document).ready(function () {
-    csrf = $('meta[name=_csrf]').attr("content");
-    suburl = $('meta[name=_suburl]').attr("content");
-
-    // Set cursor to the end of autofocus input string
-    $('input[autofocus]').each(function () {
-        $(this).val($(this).val());
-    })
-
-    // Show exact time
-    $('.time-since').each(function () {
-        $(this).addClass('poping up').attr('data-content', $(this).attr('title')).attr('data-variation', 'inverted tiny').attr('title', '');
-    });
-
-    // Semantic UI modules.
-    $('.ui.dropdown').dropdown({
-        forceSelection: false
-    });
-    $('.jump.dropdown').dropdown({
-        action: 'select',
-        onShow: function () {
-            $('.poping.up').popup('hide');
-        }
-    });
-    $('.slide.up.dropdown').dropdown({
-        transition: 'slide up'
-    });
-    $('.upward.dropdown').dropdown({
-        direction: 'upward'
-    });
-    $('.ui.accordion').accordion();
-    $('.ui.checkbox').checkbox();
-    $('.ui.progress').progress({
-        showActivity: false
-    });
-    $('.poping.up').popup();
-    $('.top.menu .poping.up').popup({
-        onShow: function () {
-            if ($('.top.menu .menu.transition').hasClass('visible')) {
-                return false;
-            }
-        }
-    });
-    $('.tabular.menu .item').tab();
-    $('.tabable.menu .item').tab();
-
-    $('.toggle.button').click(function () {
-        $($(this).data('target')).slideToggle(100);
-    });
-
-    // Dropzone
-    var $dropzone = $('#dropzone');
-    if ($dropzone.length > 0) {
-        var filenameDict = {};
-        $dropzone.dropzone({
-            url: $dropzone.data('upload-url'),
-            headers: { "X-Csrf-Token": csrf },
-            maxFiles: $dropzone.data('max-file'),
-            maxFilesize: $dropzone.data('max-size'),
-            acceptedFiles: ($dropzone.data('accepts') === '*/*') ? null : $dropzone.data('accepts'),
-            addRemoveLinks: true,
-            dictDefaultMessage: $dropzone.data('default-message'),
-            dictInvalidFileType: $dropzone.data('invalid-input-type'),
-            dictFileTooBig: $dropzone.data('file-too-big'),
-            dictRemoveFile: $dropzone.data('remove-file'),
-            init: function () {
-                this.on("success", function (file, data) {
-                    filenameDict[file.name] = data.uuid;
-                    var input = $('<input id="' + data.uuid + '" name="files" type="hidden">').val(data.uuid);
-                    $('.files').append(input);
-                });
-                this.on("removedfile", function (file) {
-                    if (file.name in filenameDict) {
-                        $('#' + filenameDict[file.name]).remove();
-                    }
-                    if ($dropzone.data('remove-url') && $dropzone.data('csrf')) {
-                        $.post($dropzone.data('remove-url'), {
-                            file: filenameDict[file.name],
-                            _csrf: $dropzone.data('csrf')
-                        });
-                    }
-                })
-            }
-        });
+  $(".events.checkbox input").change(function() {
+    if ($(this).is(":checked")) {
+      $(".events.fields").show();
     }
-
-    // Emojify
-    emojify.setConfig({
-        img_dir: suburl + '/img/emoji',
-        ignore_emoticons: true
-    });
-    var hasEmoji = document.getElementsByClassName('has-emoji');
-    for (var i = 0; i < hasEmoji.length; i++) {
-        emojify.run(hasEmoji[i]);
+  });
+  $(".non-events.checkbox input").change(function() {
+    if ($(this).is(":checked")) {
+      $(".events.fields").hide();
     }
-
-    // Clipboard JS
-    var clipboard = new ClipboardJS('.clipboard');
-    clipboard.on('success', function (e) {
-        e.clearSelection();
-
-        $('#' + e.trigger.getAttribute('id')).popup('destroy');
-        e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-success'))
-        $('#' + e.trigger.getAttribute('id')).popup('show');
-        e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'))
-    });
-
-    clipboard.on('error', function (e) {
-        $('#' + e.trigger.getAttribute('id')).popup('destroy');
-        e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-error'))
-        $('#' + e.trigger.getAttribute('id')).popup('show');
-        e.trigger.setAttribute('data-content', e.trigger.getAttribute('data-original'))
+  });
+
+  // Highlight payload on first click
+  $(".hook.history.list .toggle.button").click(function() {
+    $($(this).data("target") + " .nohighlight").each(function() {
+      var $this = $(this);
+      $this.removeClass("nohighlight");
+      setTimeout(function() {
+        hljs.highlightBlock($this[0]);
+      }, 500);
     });
+  });
+
+  // Trigger delivery
+  $(".delivery.button, .redelivery.button").click(function() {
+    var $this = $(this);
+    $this.addClass("loading disabled");
+    $.post($this.data("link"), {
+      _csrf: csrf
+    }).done(
+      setTimeout(function() {
+        window.location.href = $this.data("redirect");
+      }, 5000)
+    );
+  });
+}
 
-    // Autosize
-    if ($('#description.autosize').length > 0) {
-        autosize($('#description'));
-        showMessageMaxLength(512, 'description', 'descLength');
+$(document).ready(function() {
+  csrf = $("meta[name=_csrf]").attr("content");
+  suburl = $("meta[name=_suburl]").attr("content");
+
+  // Set cursor to the end of autofocus input string
+  $("input[autofocus]").each(function() {
+    $(this).val($(this).val());
+  });
+
+  // Show exact time
+  $(".time-since").each(function() {
+    $(this)
+      .addClass("poping up")
+      .attr("data-content", $(this).attr("title"))
+      .attr("data-variation", "inverted tiny")
+      .attr("title", "");
+  });
+
+  // Semantic UI modules.
+  $(".ui.dropdown").dropdown({
+    forceSelection: false
+  });
+  $(".jump.dropdown").dropdown({
+    action: "select",
+    onShow: function() {
+      $(".poping.up").popup("hide");
     }
-
-    // AJAX load buttons
-    $('.ajax-load-button').click(function () {
-        var $this = $(this);
-        $this.addClass('disabled');
-
-        $.ajax({
-            url: $this.data('url'),
-            headers: {
-                'X-AJAX': "true"
-            }
-        }).done(function (data, status, request) {
-            $(data).insertBefore($this);
-
-            // Update new URL or remove self if no more feeds
-            var url = request.getResponseHeader('X-AJAX-URL');
-            if (url) {
-                $this.data('url', url);
-                $this.removeClass('disabled');
-            } else {
-                $this.remove();
-            }
-        });
-    });
-
-    // Helpers
-    $('.delete-button').click(function () {
-        var $this = $(this);
-        $('.delete.modal').modal({
-            closable: false,
-            onApprove: function () {
-                if ($this.data('type') == "form") {
-                    $($this.data('form')).submit();
-                    return;
-                }
-
-                $.post($this.data('url'), {
-                    "_csrf": csrf,
-                    "id": $this.data("id")
-                }).done(function (data) {
-                    window.location.href = data.redirect;
-                });
-            }
-        }).modal('show');
+  });
+  $(".slide.up.dropdown").dropdown({
+    transition: "slide up"
+  });
+  $(".upward.dropdown").dropdown({
+    direction: "upward"
+  });
+  $(".ui.accordion").accordion();
+  $(".ui.checkbox").checkbox();
+  $(".ui.progress").progress({
+    showActivity: false
+  });
+  $(".poping.up").popup();
+  $(".top.menu .poping.up").popup({
+    onShow: function() {
+      if ($(".top.menu .menu.transition").hasClass("visible")) {
         return false;
-    });
-    $('.show-panel.button').click(function () {
-        $($(this).data('panel')).show();
-    });
-    $('.show-modal.button').click(function () {
-        $($(this).data('modal')).modal('show');
-    });
-    $('.delete-post.button').click(function () {
-        var $this = $(this);
-        $.post($this.data('request-url'), {
-            "_csrf": csrf
-        }).done(function () {
-            window.location.href = $this.data('done-url');
+      }
+    }
+  });
+  $(".tabular.menu .item").tab();
+  $(".tabable.menu .item").tab();
+
+  $(".toggle.button").click(function() {
+    $($(this).data("target")).slideToggle(100);
+  });
+
+  // Dropzone
+  var $dropzone = $("#dropzone");
+  if ($dropzone.length > 0) {
+    var filenameDict = {};
+    $dropzone.dropzone({
+      url: $dropzone.data("upload-url"),
+      headers: { "X-CSRF-Token": csrf },
+      maxFiles: $dropzone.data("max-file"),
+      maxFilesize: $dropzone.data("max-size"),
+      acceptedFiles:
+        $dropzone.data("accepts") === "*/*" ? null : $dropzone.data("accepts"),
+      addRemoveLinks: true,
+      dictDefaultMessage: $dropzone.data("default-message"),
+      dictInvalidFileType: $dropzone.data("invalid-input-type"),
+      dictFileTooBig: $dropzone.data("file-too-big"),
+      dictRemoveFile: $dropzone.data("remove-file"),
+      init: function() {
+        this.on("success", function(file, data) {
+          filenameDict[file.name] = data.uuid;
+          var input = $(
+            '<input id="' + data.uuid + '" name="files" type="hidden">'
+          ).val(data.uuid);
+          $(".files").append(input);
+        });
+        this.on("removedfile", function(file) {
+          if (file.name in filenameDict) {
+            $("#" + filenameDict[file.name]).remove();
+          }
+          if ($dropzone.data("remove-url") && $dropzone.data("csrf")) {
+            $.post($dropzone.data("remove-url"), {
+              file: filenameDict[file.name],
+              _csrf: $dropzone.data("csrf")
+            });
+          }
         });
+      }
     });
-    // To make arbitrary form element to behave like a submit button
-    $('.submit-button').click(function () {
-        $($(this).data('form')).submit();
+  }
+
+  // Emojify
+  emojify.setConfig({
+    img_dir: suburl + "/img/emoji",
+    ignore_emoticons: true
+  });
+  var hasEmoji = document.getElementsByClassName("has-emoji");
+  for (var i = 0; i < hasEmoji.length; i++) {
+    emojify.run(hasEmoji[i]);
+  }
+
+  // Clipboard JS
+  var clipboard = new ClipboardJS(".clipboard");
+  clipboard.on("success", function(e) {
+    e.clearSelection();
+
+    $("#" + e.trigger.getAttribute("id")).popup("destroy");
+    e.trigger.setAttribute(
+      "data-content",
+      e.trigger.getAttribute("data-success")
+    );
+    $("#" + e.trigger.getAttribute("id")).popup("show");
+    e.trigger.setAttribute(
+      "data-content",
+      e.trigger.getAttribute("data-original")
+    );
+  });
+
+  clipboard.on("error", function(e) {
+    $("#" + e.trigger.getAttribute("id")).popup("destroy");
+    e.trigger.setAttribute(
+      "data-content",
+      e.trigger.getAttribute("data-error")
+    );
+    $("#" + e.trigger.getAttribute("id")).popup("show");
+    e.trigger.setAttribute(
+      "data-content",
+      e.trigger.getAttribute("data-original")
+    );
+  });
+
+  // Autosize
+  if ($("#description.autosize").length > 0) {
+    autosize($("#description"));
+    showMessageMaxLength(512, "description", "descLength");
+  }
+
+  // AJAX load buttons
+  $(".ajax-load-button").click(function() {
+    var $this = $(this);
+    $this.addClass("disabled");
+
+    $.ajax({
+      url: $this.data("url"),
+      headers: {
+        "X-AJAX": "true"
+      }
+    }).done(function(data, status, request) {
+      $(data).insertBefore($this);
+
+      // Update new URL or remove self if no more feeds
+      var url = request.getResponseHeader("X-AJAX-URL");
+      if (url) {
+        $this.data("url", url);
+        $this.removeClass("disabled");
+      } else {
+        $this.remove();
+      }
     });
-
-    // Check or select on option to enable/disable target region
-    $('.enable-system').change(function () {
-        if (this.checked) {
-            $($(this).data('target')).removeClass('disabled');
-        } else {
-            $($(this).data('target')).addClass('disabled');
+  });
+
+  // Helpers
+  $(".delete-button").click(function() {
+    var $this = $(this);
+    $(".delete.modal")
+      .modal({
+        closable: false,
+        onApprove: function() {
+          if ($this.data("type") == "form") {
+            $($this.data("form")).submit();
+            return;
+          }
+
+          $.post($this.data("url"), {
+            _csrf: csrf,
+            id: $this.data("id")
+          }).done(function(data) {
+            window.location.href = data.redirect;
+          });
         }
+      })
+      .modal("show");
+    return false;
+  });
+  $(".show-panel.button").click(function() {
+    $($(this).data("panel")).show();
+  });
+  $(".show-modal.button").click(function() {
+    $($(this).data("modal")).modal("show");
+  });
+  $(".delete-post.button").click(function() {
+    var $this = $(this);
+    $.post($this.data("request-url"), {
+      _csrf: csrf
+    }).done(function() {
+      window.location.href = $this.data("done-url");
     });
-    $('.enable-system-radio').change(function () {
-        $($(this).data('enable')).removeClass('disabled');
-        $($(this).data('disable')).addClass('disabled');
-    });
-
-    // Set anchor.
-    $('.markdown').each(function () {
-        var headers = {};
-        $(this).find('h1, h2, h3, h4, h5, h6').each(function () {
-            var node = $(this);
-            var val = encodeURIComponent(node.text().toLowerCase().replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g, '').replace(/[ ]/g, '-'));
-            var name = val;
-            if (headers[val] > 0) {
-                name = val + '-' + headers[val];
-            }
-            if (headers[val] == undefined) {
-                headers[val] = 1;
-            } else {
-                headers[val] += 1;
-            }
-            node = node.wrap('<div id="' + name + '" class="anchor-wrap" ></div>');
-            node.append('<a class="anchor" href="#' + name + '"><span class="octicon octicon-link"></span></a>');
-        });
-    });
-
-    buttonsClickOnEnter();
-    searchUsers();
-    searchRepositories();
-
-    initCommentForm();
-    initRepository();
-    initWikiForm();
-    initEditForm();
-    initEditor();
-    initOrganization();
-    initAdmin();
-    initCodeView();
-
-    // Repo clone url.
-    if ($('#repo-clone-url').length > 0) {
-        switch (localStorage.getItem('repo-clone-protocol')) {
-            case 'ssh':
-                if ($('#repo-clone-ssh').click().length === 0) {
-                    $('#repo-clone-https').click();
-                }
-                break;
-            default:
-                $('#repo-clone-https').click();
-                break;
-        }
+  });
+  // To make arbitrary form element to behave like a submit button
+  $(".submit-button").click(function() {
+    $($(this).data("form")).submit();
+  });
+
+  // Check or select on option to enable/disable target region
+  $(".enable-system").change(function() {
+    if (this.checked) {
+      $($(this).data("target")).removeClass("disabled");
+    } else {
+      $($(this).data("target")).addClass("disabled");
     }
-
-    var routes = {
-        'div.user.settings': initUserSettings,
-        'div.repository.settings.collaboration': initRepositoryCollaboration,
-        'div.webhook.settings': initWebhookSettings
-    };
-
-    var selector;
-    for (selector in routes) {
-        if ($(selector).length > 0) {
-            routes[selector]();
-            break;
+  });
+  $(".enable-system-radio").change(function() {
+    $($(this).data("enable")).removeClass("disabled");
+    $($(this).data("disable")).addClass("disabled");
+  });
+
+  // Set anchor.
+  $(".markdown").each(function() {
+    var headers = {};
+    $(this)
+      .find("h1, h2, h3, h4, h5, h6")
+      .each(function() {
+        var node = $(this);
+        var val = encodeURIComponent(
+          node
+            .text()
+            .toLowerCase()
+            .replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g, "")
+            .replace(/[ ]/g, "-")
+        );
+        var name = val;
+        if (headers[val] > 0) {
+          name = val + "-" + headers[val];
         }
+        if (headers[val] == undefined) {
+          headers[val] = 1;
+        } else {
+          headers[val] += 1;
+        }
+        node = node.wrap('<div id="' + name + '" class="anchor-wrap" ></div>');
+        node.append(
+          '<a class="anchor" href="#' +
+            name +
+            '"><span class="octicon octicon-link"></span></a>'
+        );
+      });
+  });
+
+  buttonsClickOnEnter();
+  searchUsers();
+  searchRepositories();
+
+  initCommentForm();
+  initRepository();
+  initWikiForm();
+  initEditForm();
+  initEditor();
+  initOrganization();
+  initAdmin();
+  initCodeView();
+
+  // Repo clone url.
+  if ($("#repo-clone-url").length > 0) {
+    switch (localStorage.getItem("repo-clone-protocol")) {
+      case "ssh":
+        if ($("#repo-clone-ssh").click().length === 0) {
+          $("#repo-clone-https").click();
+        }
+        break;
+      default:
+        $("#repo-clone-https").click();
+        break;
+    }
+  }
+
+  var routes = {
+    "div.user.settings": initUserSettings,
+    "div.repository.settings.collaboration": initRepositoryCollaboration,
+    "div.webhook.settings": initWebhookSettings
+  };
+
+  var selector;
+  for (selector in routes) {
+    if ($(selector).length > 0) {
+      routes[selector]();
+      break;
     }
+  }
 });
 
 function changeHash(hash) {
-    if (history.pushState) {
-        history.pushState(null, null, hash);
-    }
-    else {
-        location.hash = hash;
-    }
+  if (history.pushState) {
+    history.pushState(null, null, hash);
+  } else {
+    location.hash = hash;
+  }
 }
 
 function deSelect() {
-    if (window.getSelection) {
-        window.getSelection().removeAllRanges();
-    } else {
-        document.selection.empty();
-    }
+  if (window.getSelection) {
+    window.getSelection().removeAllRanges();
+  } else {
+    document.selection.empty();
+  }
 }
 
 function selectRange($list, $select, $from) {
-    $list.removeClass('active');
-    if ($from) {
-        var a = parseInt($select.attr('rel').substr(1));
-        var b = parseInt($from.attr('rel').substr(1));
-        var c;
-        if (a != b) {
-            if (a > b) {
-                c = a;
-                a = b;
-                b = c;
-            }
-            var classes = [];
-            for (var i = a; i <= b; i++) {
-                classes.push('.L' + i);
-            }
-            $list.filter(classes.join(',')).addClass('active');
-            changeHash('#L' + a + '-' + 'L' + b);
-            return
-        }
+  $list.removeClass("active");
+  if ($from) {
+    var a = parseInt($select.attr("rel").substr(1));
+    var b = parseInt($from.attr("rel").substr(1));
+    var c;
+    if (a != b) {
+      if (a > b) {
+        c = a;
+        a = b;
+        b = c;
+      }
+      var classes = [];
+      for (var i = a; i <= b; i++) {
+        classes.push(".L" + i);
+      }
+      $list.filter(classes.join(",")).addClass("active");
+      changeHash("#L" + a + "-" + "L" + b);
+      return;
     }
-    $select.addClass('active');
-    changeHash('#' + $select.attr('rel'));
+  }
+  $select.addClass("active");
+  changeHash("#" + $select.attr("rel"));
 }
 
-$(function () {
-    if ($('.user.signin').length > 0) return;
-    $('form').areYouSure();
+$(function() {
+  if ($(".user.signin").length > 0) return;
+  $("form").areYouSure();
 });
 
 // getByteLen counts bytes in a string's UTF-8 representation.
 function getByteLen(normalVal) {
-    // Force string type
-    normalVal = String(normalVal);
-
-    var byteLen = 0;
-    for (var i = 0; i < normalVal.length; i++) {
-        var c = normalVal.charCodeAt(i);
-        byteLen += c < (1 << 7) ? 1 :
-            c < (1 << 11) ? 2 :
-                c < (1 << 16) ? 3 :
-                    c < (1 << 21) ? 4 :
-                        c < (1 << 26) ? 5 :
-                            c < (1 << 31) ? 6 : Number.NaN;
-    }
-    return byteLen;
+  // Force string type
+  normalVal = String(normalVal);
+
+  var byteLen = 0;
+  for (var i = 0; i < normalVal.length; i++) {
+    var c = normalVal.charCodeAt(i);
+    byteLen +=
+      c < 1 << 7
+        ? 1
+        : c < 1 << 11
+        ? 2
+        : c < 1 << 16
+        ? 3
+        : c < 1 << 21
+        ? 4
+        : c < 1 << 26
+        ? 5
+        : c < 1 << 31
+        ? 6
+        : Number.NaN;
+  }
+  return byteLen;
 }
 
 function showMessageMaxLength(maxLen, textElemId, counterId) {
-    var $msg = $('#' + textElemId);
-    $('#' + counterId).html(maxLen - getByteLen($msg.val()));
-
-    var onMessageKey = function (e) {
-        var $msg = $(this);
-        var text = $msg.val();
-        var len = getByteLen(text);
-        var remainder = maxLen - len;
-
-        if (len >= maxLen) {
-            $msg.val($msg.val().substr(0, maxLen));
-            remainder = 0;
-        }
+  var $msg = $("#" + textElemId);
+  $("#" + counterId).html(maxLen - getByteLen($msg.val()));
+
+  var onMessageKey = function(e) {
+    var $msg = $(this);
+    var text = $msg.val();
+    var len = getByteLen(text);
+    var remainder = maxLen - len;
+
+    if (len >= maxLen) {
+      $msg.val($msg.val().substr(0, maxLen));
+      remainder = 0;
+    }
 
-        $('#' + counterId).html(remainder);
-    };
+    $("#" + counterId).html(remainder);
+  };
 
-    $msg.keyup(onMessageKey).keydown(onMessageKey);
+  $msg.keyup(onMessageKey).keydown(onMessageKey);
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов