BigW Consortium Gitlab

blob.js.coffee 2.41 KB
Newer Older
1 2
class BlobView
  constructor: ->
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
    # handle multi-line select
    handleMultiSelect = (e) ->
      [ first_line, last_line ] = parseSelectedLines()
      [ line_number ] = parseSelectedLines($(this).attr("id"))
      hash = "L#{line_number}"

      if e.shiftKey and not isNaN(first_line) and not isNaN(line_number)
        if line_number < first_line
          last_line = first_line
          first_line = line_number
        else
          last_line = line_number

        hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}"

      setHash(hash)
      e.preventDefault()
 
21 22
    # See if there are lines selected
    # "#L12" and "#L34-56" supported
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
    highlightBlobLines = (e) ->
      [ first_line, last_line ] = parseSelectedLines()

      unless isNaN first_line
        $("#tree-content-holder .highlight .line").removeClass("hll")
        $("#LC#{line}").addClass("hll") for line in [first_line..last_line]
        $("#L#{first_line}").ScrollTo() unless e?

    # parse selected lines from hash
    # always return first and last line (initialized to NaN)
    parseSelectedLines = (str) ->
      first_line = NaN
      last_line = NaN
      hash = str || window.location.hash

      if hash isnt ""
        matches = hash.match(/\#?L(\d+)(\-(\d+))?/)
40 41
        first_line = parseInt(matches?[1])
        last_line = parseInt(matches?[3])
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
        last_line = first_line if isNaN(last_line)

      [ first_line, last_line ]

    setHash = (hash) ->
      hash = hash.replace(/^\#/, "")
      nodes = $("#" + hash)
      # if any nodes are using this id, they must be temporarily changed
      # also, add a temporary div at the top of the screen to prevent scrolling
      if nodes.length > 0
        scroll_top = $(document).scrollTop()
        nodes.attr("id", "")
        tmp = $("<div></div>")
          .css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" })
          .attr("id", hash)
          .appendTo(document.body)

      window.location.hash = hash

      # restore the nodes
      if nodes.length > 0
        tmp.remove()
        nodes.attr("id", hash)
65

66 67
    # initialize multi-line select
    $("#tree-content-holder .line_numbers a[id^=L]").on("click", handleMultiSelect)
68 69 70 71 72

    # Highlight the correct lines on load
    highlightBlobLines()

    # Highlight the correct lines when the hash part of the URL changes
73
    $(window).on("hashchange", highlightBlobLines)
74 75 76


@BlobView = BlobView