index.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. class ArchiveCommit {
  2. constructor(message, time, sha) {
  3. this.message = message
  4. this.time = time
  5. this.sha = sha
  6. }
  7. }
  8. function replace_urls(text, url_before, url_after) {
  9. for(const key of ["src=\""]) {
  10. segments = text.split(key)
  11. result_text = segments[0]
  12. for(const segment of segments.slice(1)) {
  13. var index = segment.indexOf('"')
  14. var first = segment.substring(0, index)
  15. var second = segment.substring(index)
  16. var new_url = url_before + encodeURIComponent(first) + url_after
  17. result_text += key + new_url + second
  18. }
  19. text = result_text
  20. }
  21. return text
  22. }
  23. class ArchiveView {
  24. constructor(dateselector, commitsSelect, content, token, url, project_id, branch, page_path) {
  25. this.token = token
  26. this.url = url
  27. this.project_id = project_id
  28. this.branch = branch
  29. this.dateselector = dateselector
  30. this.dateselector.value = ""
  31. this.dateselector.max = new Date().toLocaleDateString('en-ca')
  32. // Alternative, doesn't allow selecting today in first two hours of day:
  33. // this.dateselector.max = new Date().toISOString().split("T")[0]
  34. this.dateselector.addEventListener("input",((event) => this.on_date_selected(event)))
  35. this.commitsSelect = commitsSelect
  36. this.commitsSelect.addEventListener("input",((event) => this.on_commit_selected(event)))
  37. this.content = content
  38. this.page_path = page_path
  39. }
  40. add_commits(commits) {
  41. commits.map(commit => {
  42. var elem = document.createElement("option")
  43. elem.innerHTML = commit.message
  44. elem.value = commit.sha
  45. this.commitsSelect.appendChild(elem)
  46. })
  47. }
  48. on_date_selected(event) {
  49. if (!event.target.value)
  50. return
  51. var page = 1
  52. var date = event.target.value
  53. // Clean commits list
  54. this.commitsSelect.innerHTML = ""
  55. this.commitsSelect.appendChild(document.createElement("option"))
  56. this.load_pages_recursive(page, date)
  57. }
  58. on_commit_selected(event) {
  59. var sha = event.target.value
  60. var url_before = 'https://' + this.url + '/api/v4/projects/' + this.project_id + '/repository/files/' + encodeURIComponent(this.page_path + "/")
  61. var url_after = '/raw?ref=' + sha + '&private_token=' + this.token
  62. var url = url_before + encodeURIComponent("index.html") + url_after
  63. fetch(url)
  64. .then(response => response.text())
  65. .then(text => {
  66. console.log(text)
  67. var cleaned_text = replace_urls(text, url_before, url_after)
  68. console.log(cleaned_text)
  69. const blobContent = new Blob([cleaned_text], {type: "text/html"})
  70. this.content.src = URL.createObjectURL(blobContent)
  71. })
  72. }
  73. load_pages_recursive(page, date) {
  74. var commits_url = 'https://' + this.url + '/api/v4/projects/' + this.project_id + '/repository/commits?ref_name=' + this.branch + '&private_token=' + this.token + "&since="+date+"T00:00&until="+date+"T24:00&per_page=100&page=" + page;
  75. var length_promise = fetch(commits_url)
  76. .then(response => response.json())
  77. .then(
  78. // Translate response to commits
  79. json => json.map(
  80. gitlab_commit => new ArchiveCommit(
  81. gitlab_commit.message,
  82. gitlab_commit.created_at,
  83. gitlab_commit.id
  84. )
  85. )
  86. ).then((commits) => {
  87. this.add_commits(commits)
  88. return commits.length
  89. }
  90. ).then((length) => {
  91. if (length > 0) {
  92. this.load_pages_recursive(page+1, date)
  93. }
  94. })
  95. }
  96. }