ifcurl/forgejo/templates/custom/footer.tmpl
Bruno Postle ee317bef75 footer.tmpl: View in 3D on history page; urlTerminators fix; selector docs
- footer.tmpl: refactor to inject per-commit "View in 3D" links on the file
  history page, alongside the existing file view page button
- ifc_url.go: add ')' to urlTerminators so bare ifc:// URLs followed by a
  closing parenthesis are correctly terminated
- ifc_url_test.go: add tests for @ in query value, ) terminator, trailing
  period, and SERVICE_TOKEN presence/absence in preview URL
- viewer.html: selector input placeholder and title attribute now document
  that the browser viewer only supports type-name union selectors
- README: document viewer selector limitation vs full server-side behaviour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 15:45:31 +01:00

74 lines
2.7 KiB
Cheetah

<script>
// Copyright 2026 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
//
// ifcurl — inject "View in 3D" button on .ifc file view and history pages.
//
// Deploy to: /etc/forgejo/templates/custom/footer.tmpl
//
// Uses commit-hash hrefs (always unambiguous) to construct ifc:// URLs.
(function () {
"use strict";
var VIEWER_BASE = "/assets/viewer.html";
// Parse /owner/repo/src/commit/{40hex}/{treepath}
// Returns {repoPath, hash, treePath} or null.
function parseCommitHref(href) {
var m = href.match(/^\/([^/]+\/[^/]+)\/src\/commit\/([0-9a-f]{40})\/(.+)$/i);
if (!m) return null;
return { repoPath: m[1], hash: m[2], treePath: m[3] };
}
function makeViewerLink(info, label, cls) {
var host = window.location.host;
var ifcUrl = "ifc://" + host + "/" + info.repoPath
+ "@" + info.hash
+ "?path=" + encodeURIComponent(info.treePath);
var a = document.createElement("a");
a.href = VIEWER_BASE + "?url=" + encodeURIComponent(ifcUrl);
a.target = "_blank";
a.rel = "noopener noreferrer";
a.className = cls || "ui mini basic button";
a.textContent = label;
return a;
}
function init() {
var host = window.location.host;
// -----------------------------------------------------------------------
// Case 1: single file view — permalink button in .file-header-right.
// -----------------------------------------------------------------------
var btnGroup = document.querySelector(".file-header-right .ui.buttons");
if (btnGroup) {
// Permalink href or current URL when already at a commit.
var a = document.querySelector('a[href*="/src/commit/"]');
var href = a ? a.getAttribute("href") : window.location.pathname;
var info = parseCommitHref(href);
if (info && info.treePath.toLowerCase().endsWith(".ifc")) {
btnGroup.appendChild(makeViewerLink(info, "View in 3D"));
}
return;
}
// -----------------------------------------------------------------------
// Case 2: file history page — inject a "3D" link next to each commit's
// browse-file link (/src/commit/{hash}/{treepath}).
// -----------------------------------------------------------------------
document.querySelectorAll('a[href*="/src/commit/"]').forEach(function(a) {
var info = parseCommitHref(a.getAttribute("href"));
if (!info || !info.treePath.toLowerCase().endsWith(".ifc")) return;
var btn = makeViewerLink(info, "3D");
btn.style.marginLeft = "4px";
a.insertAdjacentElement("afterend", btn);
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
</script>