// These two things need to be updated at each release for the version selector. // Last stable version const stableVersion = "v4.11.1" // Dictionary doc folder to label. The last stable version should have an empty key. const versionMapping = { "master": "master", "": "v4.11.0/v4.11.1 (stable)", "v4.10.1": "v4.10.0/v4.10.1", "v4.9.2": "v4.9.0/v4.9.1/v4.9.2", "v4.8.2": "v4.8.0/v4.8.1/v4.8.2", "v4.7.0": "v4.7.0", "v4.6.0": "v4.6.0", "v4.5.1": "v4.5.0/v4.5.1", "v4.4.2": "v4.4.0/v4.4.1/v4.4.2", "v4.3.3": "v4.3.0/v4.3.1/v4.3.2/v4.3.3", "v4.2.2": "v4.2.0/v4.2.1/v4.2.2", "v4.1.1": "v4.1.0/v4.1.1", "v4.0.1": "v4.0.0/v4.0.1", "v3.5.1": "v3.5.0/v3.5.1", "v3.4.0": "v3.4.0", "v3.3.1": "v3.3.0/v3.3.1", "v3.2.0": "v3.2.0", "v3.1.0": "v3.1.0", "v3.0.2": "v3.0.0/v3.0.1/v3.0.2", "v2.11.0": "v2.11.0", "v2.10.0": "v2.10.0", "v2.9.1": "v2.9.0/v2.9.1", "v2.8.0": "v2.8.0", "v2.7.0": "v2.7.0", "v2.6.0": "v2.6.0", "v2.5.1": "v2.5.0/v2.5.1", "v2.4.0": "v2.4.0/v2.4.1", "v2.3.0": "v2.3.0", "v2.2.0": "v2.2.0/v2.2.1/v2.2.2", "v2.1.1": "v2.1.1", "v2.0.0": "v2.0.0", "v1.2.0": "v1.2.0", "v1.1.0": "v1.1.0", "v1.0.0": "v1.0.0" } // The page that have a notebook and therefore should have the open in colab badge. const hasNotebook = [ "benchmarks", "custom_datasets", "multilingual", "perplexity", "preprocessing", "quicktour", "task_summary", "tokenizer_summary", "training" ]; function addIcon() { const huggingFaceLogo = "https://huggingface.co/landing/assets/transformers-docs/huggingface_logo.svg"; const image = document.createElement("img"); image.setAttribute("src", huggingFaceLogo); const div = document.createElement("div"); div.appendChild(image); div.style.textAlign = 'center'; div.style.paddingTop = '30px'; div.style.backgroundColor = '#6670FF'; const scrollDiv = document.querySelector(".wy-side-scroll"); scrollDiv.prepend(div); } function addCustomFooter() { const customFooter = document.createElement("div"); const questionOrIssue = document.createElement("div"); questionOrIssue.innerHTML = "Stuck? Read our Blog posts or Create an issue"; customFooter.appendChild(questionOrIssue); customFooter.classList.add("footer"); const social = document.createElement("div"); social.classList.add("footer__Social"); const imageDetails = [ { link: "https://huggingface.co", imageLink: "https://huggingface.co/landing/assets/transformers-docs/website.svg" }, { link: "https://twitter.com/huggingface", imageLink: "https://huggingface.co/landing/assets/transformers-docs/twitter.svg" }, { link: "https://github.com/huggingface", imageLink: "https://huggingface.co/landing/assets/transformers-docs/github.svg" }, { link: "https://www.linkedin.com/company/huggingface/", imageLink: "https://huggingface.co/landing/assets/transformers-docs/linkedin.svg" } ]; imageDetails.forEach(imageLinks => { const link = document.createElement("a"); const image = document.createElement("img"); image.src = imageLinks.imageLink; link.href = imageLinks.link; image.style.width = "30px"; image.classList.add("footer__CustomImage"); link.appendChild(image); social.appendChild(link); }); customFooter.appendChild(social); document.querySelector("footer").appendChild(customFooter); } function addGithubButton() { const div = `
Star
`; document.querySelector(".wy-side-nav-search .icon-home").insertAdjacentHTML('afterend', div); } function addColabLink() { const parts = location.toString().split('/'); const pageName = parts[parts.length - 1].split(".")[0]; if (hasNotebook.includes(pageName)) { const baseURL = "https://colab.research.google.com/github/huggingface/notebooks/blob/master/transformers_doc/" const linksColab = `
Open In Colab
` const leftMenu = document.querySelector(".wy-breadcrumbs-aside") leftMenu.innerHTML = linksColab + '\n' + leftMenu.innerHTML } } function addVersionControl() { // To grab the version currently in view, we parse the url const parts = location.toString().split('/'); let versionIndex = parts.length - 2; // Index page may not have a last part with filename.html so we need to go up if (parts[parts.length - 1] != "" && ! parts[parts.length - 1].match(/\.html/)) { versionIndex = parts.length - 1; } // Main classes and models are nested so we need to go deeper else if (parts[versionIndex] == "main_classes" || parts[versionIndex] == "model_doc" || parts[versionIndex] == "internal") { versionIndex = versionIndex - 1; } const version = parts[versionIndex]; // Menu with all the links, const versionMenu = document.createElement("div"); const htmlLines = []; for (const [key, value] of Object.entries(versionMapping)) { let baseUrlIndex = (version == "transformers") ? versionIndex + 1: versionIndex; var urlParts = parts.slice(0, baseUrlIndex); if (key != "") { urlParts = urlParts.concat([key]); } urlParts = urlParts.concat(parts.slice(versionIndex+1)); htmlLines.push(`${value}`); } versionMenu.classList.add("version-dropdown"); versionMenu.innerHTML = htmlLines.join('\n'); // Button for version selection const versionButton = document.createElement("div"); versionButton.classList.add("version-button"); let label = (version == "transformers") ? stableVersion : version versionButton.innerText = label.concat(" â–Œ"); // Toggle the menu when we click on the button versionButton.addEventListener("click", () => { versionMenu.classList.toggle("version-show"); }); // Hide the menu when we click elsewhere window.addEventListener("click", (event) => { if (event.target != versionButton){ versionMenu.classList.remove('version-show'); } }); // Container const div = document.createElement("div"); div.appendChild(versionButton); div.appendChild(versionMenu); div.style.paddingTop = '25px'; div.style.backgroundColor = '#6670FF'; div.style.display = 'block'; div.style.textAlign = 'center'; const scrollDiv = document.querySelector(".wy-side-scroll"); scrollDiv.insertBefore(div, scrollDiv.children[1]); } function addHfMenu() { const div = ` `; document.body.insertAdjacentHTML('afterbegin', div); } function platformToggle() { const codeBlocks = Array.from(document.getElementsByClassName("highlight")); const pytorchIdentifier = "## PYTORCH CODE"; const tensorflowIdentifier = "## TENSORFLOW CODE"; const promptSpanIdentifier = `>>> ` const pytorchSpanIdentifier = `${pytorchIdentifier}`; const tensorflowSpanIdentifier = `${tensorflowIdentifier}`; const getFrameworkSpans = filteredCodeBlock => { const spans = filteredCodeBlock.element.innerHTML; const pytorchSpanPosition = spans.indexOf(pytorchSpanIdentifier); const tensorflowSpanPosition = spans.indexOf(tensorflowSpanIdentifier); let pytorchSpans; let tensorflowSpans; if(pytorchSpanPosition < tensorflowSpanPosition){ const isPrompt = spans.slice( spans.indexOf(tensorflowSpanIdentifier) - promptSpanIdentifier.length, spans.indexOf(tensorflowSpanIdentifier) ) == promptSpanIdentifier; const finalTensorflowSpanPosition = isPrompt ? tensorflowSpanPosition - promptSpanIdentifier.length : tensorflowSpanPosition; pytorchSpans = spans.slice(pytorchSpanPosition + pytorchSpanIdentifier.length + 1, finalTensorflowSpanPosition); tensorflowSpans = spans.slice(tensorflowSpanPosition + tensorflowSpanIdentifier.length + 1, spans.length); }else{ const isPrompt = spans.slice( spans.indexOf(pytorchSpanIdentifier) - promptSpanIdentifier.length, spans.indexOf(pytorchSpanIdentifier) ) == promptSpanIdentifier; const finalPytorchSpanPosition = isPrompt ? pytorchSpanPosition - promptSpanIdentifier.length : pytorchSpanPosition; tensorflowSpans = spans.slice(tensorflowSpanPosition + tensorflowSpanIdentifier.length + 1, finalPytorchSpanPosition); pytorchSpans = spans.slice(pytorchSpanPosition + pytorchSpanIdentifier.length + 1, spans.length); } return { ...filteredCodeBlock, pytorchSample: pytorchSpans , tensorflowSample: tensorflowSpans } }; const createFrameworkButtons = sample => { const pytorchButton = document.createElement("button"); pytorchButton.classList.add('pytorch-button') pytorchButton.innerText = "PyTorch"; const tensorflowButton = document.createElement("button"); tensorflowButton.classList.add('tensorflow-button') tensorflowButton.innerText = "TensorFlow"; const selectorDiv = document.createElement("div"); selectorDiv.classList.add("framework-selector"); selectorDiv.appendChild(pytorchButton); selectorDiv.appendChild(tensorflowButton); sample.element.parentElement.prepend(selectorDiv); // Init on PyTorch sample.element.innerHTML = sample.pytorchSample; pytorchButton.classList.add("selected"); tensorflowButton.classList.remove("selected"); pytorchButton.addEventListener("click", () => { for(const codeBlock of updatedCodeBlocks){ codeBlock.element.innerHTML = codeBlock.pytorchSample; } Array.from(document.getElementsByClassName('pytorch-button')).forEach(button => { button.classList.add("selected"); }) Array.from(document.getElementsByClassName('tensorflow-button')).forEach(button => { button.classList.remove("selected"); }) }); tensorflowButton.addEventListener("click", () => { for(const codeBlock of updatedCodeBlocks){ codeBlock.element.innerHTML = codeBlock.tensorflowSample; } Array.from(document.getElementsByClassName('tensorflow-button')).forEach(button => { button.classList.add("selected"); }) Array.from(document.getElementsByClassName('pytorch-button')).forEach(button => { button.classList.remove("selected"); }) }); }; const updatedCodeBlocks = codeBlocks .map(element => {return {element: element.firstChild, innerText: element.innerText}}) .filter(codeBlock => codeBlock.innerText.includes(pytorchIdentifier) && codeBlock.innerText.includes(tensorflowIdentifier)) .map(getFrameworkSpans) updatedCodeBlocks .forEach(createFrameworkButtons) } /*! * github-buttons v2.2.10 * (c) 2019 ăȘă€ă * @license BSD-2-Clause */ /** * modified to run programmatically */ function parseGithubButtons (){"use strict";var e=window.document,t=e.location,o=window.encodeURIComponent,r=window.decodeURIComponent,n=window.Math,a=window.HTMLElement,i=window.XMLHttpRequest,l="https://unpkg.com/github-buttons@2.2.10/dist/buttons.html",c=i&&i.prototype&&"withCredentials"in i.prototype,d=c&&a&&a.prototype.attachShadow&&!a.prototype.attachShadow.prototype,s=function(e,t,o){e.addEventListener?e.addEventListener(t,o):e.attachEvent("on"+t,o)},u=function(e,t,o){e.removeEventListener?e.removeEventListener(t,o):e.detachEvent("on"+t,o)},h=function(e,t,o){var r=function(n){return u(e,t,r),o(n)};s(e,t,r)},f=function(e,t,o){var r=function(n){if(t.test(e.readyState))return u(e,"readystatechange",r),o(n)};s(e,"readystatechange",r)},p=function(e){return function(t,o,r){var n=e.createElement(t);if(o)for(var a in o){var i=o[a];null!=i&&(null!=n[a]?n[a]=i:n.setAttribute(a,i))}if(r)for(var l=0,c=r.length;l'},eye:{width:16,height:16,path:''},star:{width:14,height:16,path:''},"repo-forked":{width:10,height:16,path:''},"issue-opened":{width:14,height:16,path:''},"cloud-download":{width:16,height:16,path:''}},w={},x=function(e,t,o){var r=p(e.ownerDocument),n=e.appendChild(r("style",{type:"text/css"}));n.styleSheet?n.styleSheet.cssText=m:n.appendChild(e.ownerDocument.createTextNode(m));var a,l,d=r("a",{className:"btn",href:t.href,target:"_blank",innerHTML:(a=t["data-icon"],l=/^large$/i.test(t["data-size"])?16:14,a=(""+a).toLowerCase().replace(/^octicon-/,""),{}.hasOwnProperty.call(v,a)||(a="mark-github"),'"),"aria-label":t["aria-label"]||void 0},[" ",r("span",{},[t["data-text"]||""])]);/\.github\.com$/.test("."+d.hostname)?/^https?:\/\/((gist\.)?github\.com\/[^\/?#]+\/[^\/?#]+\/archive\/|github\.com\/[^\/?#]+\/[^\/?#]+\/releases\/download\/|codeload\.github\.com\/)/.test(d.href)&&(d.target="_top"):(d.href="#",d.target="_self");var u,h,g,x,y=e.appendChild(r("div",{className:"widget"+(/^large$/i.test(t["data-size"])?" lg":"")},[d]));/^(true|1)$/i.test(t["data-show-count"])&&"github.com"===d.hostname&&(u=d.pathname.replace(/^(?!\/)/,"/").match(/^\/([^\/?#]+)(?:\/([^\/?#]+)(?:\/(?:(subscription)|(fork)|(issues)|([^\/?#]+)))?)?(?:[\/?#]|$)/))&&!u[6]?(u[2]?(h="/repos/"+u[1]+"/"+u[2],u[3]?(x="subscribers_count",g="watchers"):u[4]?(x="forks_count",g="network"):u[5]?(x="open_issues_count",g="issues"):(x="stargazers_count",g="stargazers")):(h="/users/"+u[1],g=x="followers"),function(e,t){var o=w[e]||(w[e]=[]);if(!(o.push(t)>1)){var r=b(function(){for(delete w[e];t=o.shift();)t.apply(null,arguments)});if(c){var n=new i;s(n,"abort",r),s(n,"error",r),s(n,"load",function(){var e;try{e=JSON.parse(n.responseText)}catch(e){return void r(e)}r(200!==n.status,e)}),n.open("GET",e),n.send()}else{var a=this||window;a._=function(e){a._=null,r(200!==e.meta.status,e.data)};var l=p(a.document)("script",{async:!0,src:e+(/\?/.test(e)?"&":"?")+"callback=_"}),d=function(){a._&&a._({meta:{}})};s(l,"load",d),s(l,"error",d),l.readyState&&f(l,/de|m/,d),a.document.getElementsByTagName("head")[0].appendChild(l)}}}.call(this,"https://api.github.com"+h,function(e,t){if(!e){var n=t[x];y.appendChild(r("a",{className:"social-count",href:t.html_url+"/"+g,target:"_blank","aria-label":n+" "+x.replace(/_count$/,"").replace("_"," ").slice(0,n<2?-1:void 0)+" on GitHub"},[r("b"),r("i"),r("span",{},[(""+n).replace(/\B(?=(\d{3})+(?!\d))/g,",")])]))}o&&o(y)})):o&&o(y)},y=window.devicePixelRatio||1,C=function(e){return(y>1?n.ceil(n.round(e*y)/y*2)/2:n.ceil(e))||0},F=function(e,t){e.style.width=t[0]+"px",e.style.height=t[1]+"px"},k=function(t,r){if(null!=t&&null!=r)if(t.getAttribute&&(t=function(e){for(var t={href:e.href,title:e.title,"aria-label":e.getAttribute("aria-label")},o=["icon","text","size","show-count"],r=0,n=o.length;r