edgewall/trac

View on GitHub
trac/htdocs/js/wiki.js

Summary

Maintainability
A
2 hrs
Test Coverage
(function($){

  // Provides expand/collapse button for central wiki column ($wikipage)
  // within its container ($content).

  window.wikiColumn = function($wikipage) {
    if ($wikipage.length === 0)
      return;
    var $content = $("#content");
    $("<span id='trac-wiki-expander'></span>").on("click", function () {
      $content.toggleClass('narrow');
      if ($content.hasClass('narrow'))
        centerLargeElements();
      else
        resetLargeElements();
    }).prependTo($wikipage);

    // Auto-centering of top-level elements larger than #wikipage's max-width
    var wpow = $wikipage.outerWidth();
    var large_elements = [];
    var detectLargeElement = function() {
      var rol = $(this).offset().left - $wikipage.offset().left;
      var excess = $(this).outerWidth() + rol - wpow;
      if (excess > 0) {
        $(this).data('excess', excess);
        $(this).data('rol', rol);
        large_elements.push(this);
      }
      return excess;
    };
    var centerLargeElement = function($e, wpleft) {
        var shift_left;
        var excess = $e.data('excess');
        var rol = $e.data('rol');
        if (excess > rol)
            shift_left = rol + (excess - rol) / 2;
        else
            shift_left = excess;
        if (shift_left > wpleft)
          shift_left = wpleft;

        $e.css({'margin-left': -shift_left,
                'background': 'rgba(255, 255, 255, .8)'});
    };
    var resetLargeElements = function() {
      for (var i = 0; i < large_elements.length; i++) {
        $(large_elements[i]).css({'margin-left': 0, 'background': 'none'});
      }
    };
    var detectLargeImage = function() {
      var excess = detectLargeElement.apply(this);
      if (excess > 0)
        centerLargeElement($(this), $wikipage.offset().left);
    };
    $("#wikipage > table").each(detectLargeElement);
    $("#wikipage > div").each(detectLargeElement);
    $("#wikipage > p > a > img").one("load", detectLargeImage).each(
      function() {
        if (this.complete)
          detectLargeImage.apply(this);
      }
    );

    var centerLargeElements = function() {
      var wikipage_left = $wikipage.offset().left;
      for (var i = 0; i < large_elements.length; i++)
        centerLargeElement($(large_elements[i]), wikipage_left);
    };
    $(window).resize(centerLargeElements);
    centerLargeElements();
  };


  jQuery(function($) {
    $("#content").find("h1,h2,h3,h4,h5,h6").addAnchor(_("Link to this section"));
    $("#content").find(".wikianchor").each(function() {
      $(this).addAnchor(babel.format(_("Link to #%(id)s"), {id: $(this).attr('id')}));
    });
    $(".foldable").enableFolding(true, true);
  });

})(jQuery);