mirror of
				https://github.com/astral-sh/uv.git
				synced 2025-11-04 13:38:59 +00:00 
			
		
		
		
	The redirect plugin doesn't support this, and it's not feasible to do server-side so we need to do the redirect client-side with some javascript.
		
			
				
	
	
		
			112 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
function cleanupClipboardText(targetSelector) {
 | 
						|
  const targetElement = document.querySelector(targetSelector);
 | 
						|
 | 
						|
  // exclude "Generic Prompt" and "Generic Output" spans from copy
 | 
						|
  const excludedClasses = ["gp", "go"];
 | 
						|
 | 
						|
  const clipboardText = Array.from(targetElement.childNodes)
 | 
						|
    .filter(
 | 
						|
      (node) =>
 | 
						|
        !excludedClasses.some((className) =>
 | 
						|
          node?.classList?.contains(className)
 | 
						|
        )
 | 
						|
    )
 | 
						|
    .map((node) => node.textContent)
 | 
						|
    .filter((s) => s != "");
 | 
						|
  return clipboardText.join("").trim();
 | 
						|
}
 | 
						|
 | 
						|
// Sets copy text to attributes lazily using an Intersection Observer.
 | 
						|
function setCopyText() {
 | 
						|
  // The `data-clipboard-text` attribute allows for customized content in the copy
 | 
						|
  // See: https://www.npmjs.com/package/clipboard#copy-text-from-attribute
 | 
						|
  const attr = "clipboardText";
 | 
						|
  // all "copy" buttons whose target selector is a <code> element
 | 
						|
  const elements = document.querySelectorAll(
 | 
						|
    'button[data-clipboard-target$="code"]'
 | 
						|
  );
 | 
						|
  const observer = new IntersectionObserver((entries) => {
 | 
						|
    entries.forEach((entry) => {
 | 
						|
      // target in the viewport that have not been patched
 | 
						|
      if (
 | 
						|
        entry.intersectionRatio > 0 &&
 | 
						|
        entry.target.dataset[attr] === undefined
 | 
						|
      ) {
 | 
						|
        entry.target.dataset[attr] = cleanupClipboardText(
 | 
						|
          entry.target.dataset.clipboardTarget
 | 
						|
        );
 | 
						|
      }
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  elements.forEach((elt) => {
 | 
						|
    observer.observe(elt);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
// Using the document$ observable is particularly important if you are using instant loading since
 | 
						|
// it will not result in a page refresh in the browser
 | 
						|
// See `How to integrate with third-party JavaScript libraries` guideline:
 | 
						|
// https://squidfunk.github.io/mkdocs-material/customization/?h=javascript#additional-javascript
 | 
						|
document$.subscribe(function () {
 | 
						|
  setCopyText();
 | 
						|
});
 | 
						|
 | 
						|
// Use client-side redirects for anchors that have moved.
 | 
						|
// Other redirects should use `redirect_maps` in the `mkdocs.yml` file instead.
 | 
						|
(function () {
 | 
						|
  let redirect_maps = {
 | 
						|
    "concepts/projects/#managing-dependencies":
 | 
						|
      "concepts/projects/dependencies/",
 | 
						|
    "concepts/projects/#project-metadata": "concepts/projects/layout/",
 | 
						|
    "concepts/projects/#defining-entry-points":
 | 
						|
      "concepts/projects/config/#entry-points",
 | 
						|
    "concepts/projects/#build-systems":
 | 
						|
      "concepts/projects/config/#build-systems",
 | 
						|
    "concepts/projects/#configuring-project-packaging":
 | 
						|
      "concepts/projects/config/#project-packaging",
 | 
						|
    "concepts/projects/#creating-projects": "concepts/projects/init/",
 | 
						|
    "concepts/projects/#project-environments":
 | 
						|
      "concepts/projects/layout/#the-project-environment",
 | 
						|
    "concepts/projects/#configuring-the-project-environment-path":
 | 
						|
      "concepts/projects/config/#project-environment-path",
 | 
						|
    "concepts/projects/#project-lockfile":
 | 
						|
      "concepts/projects/layout/#the-lockfile",
 | 
						|
    "concepts/projects/#platform-specific-dependencies":
 | 
						|
      "concepts/projects/dependenices/#platform-specific-dependencies",
 | 
						|
    "concepts/projects/#running-commands": "concepts/projects/run/",
 | 
						|
    "concepts/projects/#building-projects": "concepts/projects/build/",
 | 
						|
    "concepts/projects/#build-isolation":
 | 
						|
      "concepts/projects/config/#build-isolation",
 | 
						|
  };
 | 
						|
 | 
						|
  // The prefix for the site, see `site_dir` in `mkdocs.yml`
 | 
						|
  let site_dir = "uv";
 | 
						|
 | 
						|
  function get_path() {
 | 
						|
    var path = window.location.pathname;
 | 
						|
 | 
						|
    // Trim the site prefix
 | 
						|
    if (path.startsWith("/" + site_dir + "/")) {
 | 
						|
      path = path.slice(site_dir.length + 2);
 | 
						|
    }
 | 
						|
 | 
						|
    // Always include a trailing `/`
 | 
						|
    if (!path.endsWith("/")) {
 | 
						|
      path = path + "/";
 | 
						|
    }
 | 
						|
 | 
						|
    // Check for an anchor
 | 
						|
    var anchor = window.location.hash.substring(1);
 | 
						|
    if (!anchor) {
 | 
						|
      return path;
 | 
						|
    }
 | 
						|
 | 
						|
    return path + "#" + anchor;
 | 
						|
  }
 | 
						|
 | 
						|
  let path = get_path();
 | 
						|
  if (path && redirect_maps.hasOwnProperty(path)) {
 | 
						|
    window.location.replace("/" + site_dir + "/" + redirect_maps[path]);
 | 
						|
  }
 | 
						|
})();
 |