123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /*
- * Git HTML Archive Viewer
- *
- * Benedikt Bieringer <benedikt.b@wwu.de>
- * https://nuserv.uni-muenster.de:8443/bbieringer/statusarchiveviewer
- */
- class ArchiveCommit {
- constructor(message, time, sha) {
- this.message = message
- this.time = time
- this.sha = sha
- }
- }
- function replace_urls(text, url_before, url_after) {
- for(const key of ["src=\""]) {
- segments = text.split(key)
- result_text = segments[0]
- for(const segment of segments.slice(1)) {
- var index = segment.indexOf('"')
- var first = segment.substring(0, index)
- var second = segment.substring(index)
-
- var new_url = url_before + encodeURIComponent(first) + url_after
-
- result_text += key + new_url + second
- }
-
- text = result_text
- }
-
- return text
- }
- class ArchiveView {
- constructor(dateselector, commitsSelect, content, token, url, project_id, branch, page_path, index) {
- this.token = token
- this.url = url
- this.project_id = project_id
- this.branch = branch
-
- this.dateselector = dateselector
- this.dateselector.value = ""
- this.dateselector.max = new Date().toLocaleDateString('en-ca')
- // Alternative, doesn't allow selecting today in first two hours of day:
- // this.dateselector.max = new Date().toISOString().split("T")[0]
- this.dateselector.addEventListener("input",((event) => this.on_date_selected(event)))
-
- this.commitsSelect = commitsSelect
- this.commitsSelect.addEventListener("input",((event) => this.on_commit_selected(event)))
-
- this.content = content
-
- this.page_path = page_path
-
- this.index = index
-
- const blobContent = new Blob([`
- <!doctype html><html><head>
- <style>
- body {
- min-height: 100vh;
- display: flex;
- align-items: center;
- justify-content: space-around;
- }
-
- h1,h2 {
- display: flex;
- align-items: center;
- justify-content: center;
- }
- </style>
- </head>
- <body style="background:#aaa; color:#fff;">
- <div>
- <h1>Welcome to the archive viewer!</h1>
- <h2>Select a date and version to start!</h2>
- </div>
- </body>
- </html>
- `], {type: "text/html"})
- this.content.src = URL.createObjectURL(blobContent)
- }
-
- add_commits(commits) {
- commits.map(commit => {
- var elem = document.createElement("option")
- elem.innerHTML = commit.message
- elem.value = commit.sha
- this.commitsSelect.appendChild(elem)
- })
- }
-
- on_date_selected(event) {
- if (!event.target.value)
- return
- var page = 1
- var date = event.target.value
-
- // Clean commits list
- this.commitsSelect.innerHTML = ""
- this.commitsSelect.appendChild(document.createElement("option"))
-
- this.load_pages_recursive(page, date)
- }
-
- on_commit_selected(event) {
- var sha = event.target.value
- var url_before = 'https://' + this.url + '/api/v4/projects/' + this.project_id + '/repository/files/' + encodeURIComponent(this.page_path + "/")
- var url_after = '/raw?ref=' + sha + '&private_token=' + this.token
- var url = url_before + encodeURIComponent(this.index) + url_after
- fetch(url)
- .then(response => response.text())
- .then(text => {
- console.log(text)
- var cleaned_text = replace_urls(text, url_before, url_after)
- console.log(cleaned_text)
-
- const blobContent = new Blob([cleaned_text], {type: "text/html"})
- this.content.src = URL.createObjectURL(blobContent)
- })
- }
-
- load_pages_recursive(page, date) {
- 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;
-
- var length_promise = fetch(commits_url)
- .then(response => response.json())
- .then(
- // Translate response to commits
- json => json.map(
- gitlab_commit => new ArchiveCommit(
- gitlab_commit.message,
- gitlab_commit.created_at,
- gitlab_commit.id
- )
- )
- ).then((commits) => {
- // Skip if new date is selected
- if (date != this.dateselector.value) {
- return 0;
- }
-
- this.add_commits(commits)
- return commits.length
- }
- ).then((length) => {
- if (length > 0) {
- this.load_pages_recursive(page+1, date)
- }
- })
- }
- }
|