spec-up-t 1.0.41 → 1.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/assets/compiled/body.js
CHANGED
|
@@ -92,7 +92,7 @@ function inPageSearch(){const e=document.querySelector("span[issue-count]"),t=sp
|
|
|
92
92
|
function highlightMenuItems(){let t=null;function e(t){document.querySelectorAll("#toc_list a").forEach(t=>{t.classList.remove("highlight-cfib41dyhcd99sm")});const e=document.querySelector(`#toc_list a[href="#${t.id}"]`);e&&(e.classList.add("highlight-cfib41dyhcd99sm"),e.scrollIntoView({behavior:"smooth",block:"center"}))}const o=new IntersectionObserver((o,n)=>{const c=o.filter(t=>t.isIntersecting).map(t=>t.target);c.length>0?(t=c[0],e(t)):t&&e(t)},{root:null,rootMargin:"0px",threshold:.1});document.querySelectorAll("h2, h3, h4, h5, h6").forEach(t=>o.observe(t))}document.addEventListener("DOMContentLoaded",(function(){highlightMenuItems()}));
|
|
93
93
|
function backToTop(){const n=document.createElement("a");n.id="back-to-top-a1zncgtqfpzsig8",n.href="#content",n.innerHTML="↑",document.body.appendChild(n);const t=function(n,t){let e;return function(){const o=this,c=arguments;clearTimeout(e),e=setTimeout(()=>n.apply(o,c),t)}}((function(){window.scrollY>300?n.style.display="flex":n.style.display="none"}),600);window.addEventListener("scroll",(function(){t()}))}document.addEventListener("DOMContentLoaded",(function(){backToTop()}));
|
|
94
94
|
/**
|
|
95
|
-
* @file This file fetches and displays commit hashes by matching elements with `
|
|
95
|
+
* @file This file fetches and displays commit hashes by matching elements with `x-term-reference` class against the `allXrefs` global object.
|
|
96
96
|
* Example:
|
|
97
97
|
* const allXrefs = {
|
|
98
98
|
"xrefs": [
|
|
@@ -117,13 +117,13 @@ function backToTop(){const n=document.createElement("a");n.id="back-to-top-a1znc
|
|
|
117
117
|
* @license MIT
|
|
118
118
|
* @since 2024-06-09
|
|
119
119
|
*/
|
|
120
|
-
function fetchCommitHashes(){const e=localStorage.getItem("githubToken");const t=function(e,t){let n;return function(...o){clearTimeout(n),n=setTimeout(()=>e.apply(this,o),t)}}(()=>{notyf.error('GitHub rate limit exceeded. See <a target="_blank" rel="noopener" href="https://blockchainbird.github.io/spec-up-t-website/docs/github-token/">documentation</a> for more info.')},3e3);document.querySelectorAll(".x-term-reference").forEach(n=>{const o=n.getAttribute("data-local-href").split(":");allXrefs.xrefs.forEach(r=>{if(r.externalSpec===o[1]&&r.term.toLowerCase()===o[2].toLowerCase()){if(!r.commitHash){const e=document.createElement("span");return e.classList.add("no-xref-found-message"),e.innerHTML="No xref found.",void n.parentNode.insertBefore(e,n.nextSibling)}r.commitHash&&r.commitHash&&r.commitHash.substring(0,7);const o=document.createElement("a");o.href="https://github.com/"+r.owner+"/"+r.repo+"/compare/"+r.commitHash+"../main",o.target="_blank",o.rel="noopener noreferrer",o.classList.add("diff","xref-info-links","btn"),o.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Xref < > <svg icon><use xlink:href="#svg-github"></use></svg> Now',o.title="A Diff between the current commit hash of the definition and the commit hash referenced when the link was created.",n.parentNode.insertBefore(o,n.nextSibling);const i=document.createElement("a");i.href="https://github.com/"+r.owner+"/"+r.repo+"/blob/main/"+r.terms_dir+"/"+r.term.replace(/ /g,"-").toLowerCase()+".md",i.target="_blank",i.rel="noopener noreferrer",i.classList.add("latest-version","xref-info-links","btn"),i.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Now',i.title="Go to the repo page of the definition‘s latest version.",o.parentNode.insertBefore(i,n.nextSibling);const s=document.createElement("a");s.href="https://github.com/"+r.owner+"/"+r.repo+"/blob/"+r.commitHash+"/"+r.terms_dir+"/"+r.term.replace(/ /g,"-").toLowerCase()+".md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("exact-commit-hash","xref-info-links","btn"),s.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Xref',s.title="Go to the repo page of the definition‘s version referenced when the link was created.",i.parentNode.insertBefore(s,n.nextSibling);const a=document.createElement("button");a.classList.add("show-diff-modal","xref-info-links","btn"),a.innerHTML='Xref < > <svg icon><use xlink:href="#svg-github"></use></svg> Now',a.title="Show diff between the latest version and the referenced version",i.parentNode.insertBefore(a,n.nextSibling),a.addEventListener("click",(function(n){n.preventDefault(),function(e,n){const o={};e&&e.length>0&&(o.Authorization="token "+e),fetch("https://api.github.com/repos/"+n.owner+"/"+n.repo+"/contents/"+n.terms_dir+"/"+n.term.replace(/ /g,"-").toLowerCase()+".md",{headers:o}).then(e=>{if(403===e.status&&"0"===e.headers.get("X-RateLimit-Remaining")){const n=new Date(1e3*e.headers.get("X-RateLimit-Reset"));return console.error(`\n SPEC-UP-T: Github API rate limit exceeded. Try again after ${n}. See https://blockchainbird.github.io/spec-up-t-website/docs/github-token/ for more info.\n`),t(),!0}return console.log(`\n SPEC-UP-T: Github API rate limit: ${e.headers.get("X-RateLimit-Remaining")} requests remaining. See https://blockchainbird.github.io/spec-up-t-website/docs/github-token/ for more info.\n`),e.json()}).then(e=>{const t=atob(e.content),o=Diff.diffChars(n.content,t),r=document.createDocumentFragment();o.forEach(e=>{const t=e.added?"green":e.removed?"red":"grey",n=e.added||e.removed?"#ddd":"white";span=document.createElement("span"),span.style.color=t,span.style.backgroundColor=n,span.appendChild(document.createTextNode(e.value)),r.appendChild(span)});const i=document.createElement("div");i.innerHTML="<h1>Diff xref (local snapshot) and latest version</h1>",i.appendChild(r),i.innerHTML=i.innerHTML.replace(/\n/g,"<br>"),showModal(i.innerHTML)}).catch(e=>{console.error("Error fetching content:",e)})}(e,r)}));const c=document.createElement("button");c.classList.add("show-diff-modal","xref-info-links","btn"),c.innerHTML="Xref",c.title="Show the stored version of the term-file",a.parentNode.insertBefore(c,n.nextSibling),c.addEventListener("click",(function(e){e.preventDefault();const t=r.content.replace(/\n/g,"<br>");showModal(`\n <h1>Term definition (local snapshot)</h1>\n <table>\n <tr>\n <th>Commit hash</th>\n <td>${r.commitHash}</td>\n </tr>\n <tr>\n <th>Content</th>\n <td>${t}</td>\n </tr>\n </table>\n `)}))}})})}document.addEventListener("DOMContentLoaded",(function(){fetchCommitHashes()}));
|
|
120
|
+
function fetchCommitHashes(){if("undefined"==typeof allXrefs||null===allXrefs)return void console.log("allXrefs is not defined or does not exist. We will continue without it.");const e=localStorage.getItem("githubToken");const t=function(e,t){let n;return function(...o){clearTimeout(n),n=setTimeout(()=>e.apply(this,o),t)}}(()=>{notyf.error('GitHub rate limit exceeded. See <a target="_blank" rel="noopener" href="https://blockchainbird.github.io/spec-up-t-website/docs/github-token/">documentation</a> for more info.')},3e3);document.querySelectorAll(".x-term-reference").forEach(n=>{const o=n.getAttribute("data-local-href").split(":");allXrefs.xrefs.forEach(r=>{if(r.externalSpec===o[1]&&r.term.toLowerCase()===o[2].toLowerCase()){if(!r.commitHash){const e=document.createElement("span");return e.classList.add("no-xref-found-message"),e.innerHTML="No xref found.",void n.parentNode.insertBefore(e,n.nextSibling)}r.commitHash&&r.commitHash&&r.commitHash.substring(0,7);const o=document.createElement("a");o.href="https://github.com/"+r.owner+"/"+r.repo+"/compare/"+r.commitHash+"../main",o.target="_blank",o.rel="noopener noreferrer",o.classList.add("diff","xref-info-links","btn"),o.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Xref < > <svg icon><use xlink:href="#svg-github"></use></svg> Now',o.title="A Diff between the current commit hash of the definition and the commit hash referenced when the link was created.",n.parentNode.insertBefore(o,n.nextSibling);const i=document.createElement("a");i.href="https://github.com/"+r.owner+"/"+r.repo+"/blob/main/"+r.terms_dir+"/"+r.term.replace(/ /g,"-").toLowerCase()+".md",i.target="_blank",i.rel="noopener noreferrer",i.classList.add("latest-version","xref-info-links","btn"),i.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Now',i.title="Go to the repo page of the definition‘s latest version.",o.parentNode.insertBefore(i,n.nextSibling);const s=document.createElement("a");s.href="https://github.com/"+r.owner+"/"+r.repo+"/blob/"+r.commitHash+"/"+r.terms_dir+"/"+r.term.replace(/ /g,"-").toLowerCase()+".md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("exact-commit-hash","xref-info-links","btn"),s.innerHTML='<svg icon><use xlink:href="#svg-github"></use></svg> Xref',s.title="Go to the repo page of the definition‘s version referenced when the link was created.",i.parentNode.insertBefore(s,n.nextSibling);const a=document.createElement("button");a.classList.add("show-diff-modal","xref-info-links","btn"),a.innerHTML='Xref < > <svg icon><use xlink:href="#svg-github"></use></svg> Now',a.title="Show diff between the latest version and the referenced version",i.parentNode.insertBefore(a,n.nextSibling),a.addEventListener("click",(function(n){n.preventDefault(),function(e,n){const o={};e&&e.length>0&&(o.Authorization="token "+e),fetch("https://api.github.com/repos/"+n.owner+"/"+n.repo+"/contents/"+n.terms_dir+"/"+n.term.replace(/ /g,"-").toLowerCase()+".md",{headers:o}).then(e=>{if(403===e.status&&"0"===e.headers.get("X-RateLimit-Remaining")){const n=new Date(1e3*e.headers.get("X-RateLimit-Reset"));return console.error(`\n SPEC-UP-T: Github API rate limit exceeded. Try again after ${n}. See https://blockchainbird.github.io/spec-up-t-website/docs/github-token/ for more info.\n`),t(),!0}return console.log(`\n SPEC-UP-T: Github API rate limit: ${e.headers.get("X-RateLimit-Remaining")} requests remaining. See https://blockchainbird.github.io/spec-up-t-website/docs/github-token/ for more info.\n`),e.json()}).then(e=>{const t=atob(e.content),o=Diff.diffChars(n.content,t),r=document.createDocumentFragment();o.forEach(e=>{const t=e.added?"green":e.removed?"red":"grey",n=e.added||e.removed?"#ddd":"white";span=document.createElement("span"),span.style.color=t,span.style.backgroundColor=n,span.appendChild(document.createTextNode(e.value)),r.appendChild(span)});const i=document.createElement("div");i.innerHTML="<h1>Diff xref (local snapshot) and latest version</h1>",i.appendChild(r),i.innerHTML=i.innerHTML.replace(/\n/g,"<br>"),showModal(i.innerHTML)}).catch(e=>{console.error("Error fetching content:",e)})}(e,r)}));const c=document.createElement("button");c.classList.add("show-diff-modal","xref-info-links","btn"),c.innerHTML="Xref",c.title="Show the stored version of the term-file",a.parentNode.insertBefore(c,n.nextSibling),c.addEventListener("click",(function(e){e.preventDefault();const t=r.content.replace(/\n/g,"<br>");showModal(`\n <h1>Term definition (local snapshot)</h1>\n <table>\n <tr>\n <th>Commit hash</th>\n <td>${r.commitHash}</td>\n </tr>\n <tr>\n <th>Content</th>\n <td>${t}</td>\n </tr>\n </table>\n `)}))}})})}document.addEventListener("DOMContentLoaded",(function(){fetchCommitHashes()}));
|
|
121
121
|
function addAnchorsToTerms(){document.querySelectorAll('dt:has(> span[id^="term:"])').forEach(e=>{const t=function(e){let t=e;for(;t.querySelector('span[id^="term:"]');)t=t.querySelector('span[id^="term:"]');return t}(e),r=t.getAttribute("id"),n=document.createElement("a");n.setAttribute("href","#"+r),n.setAttribute("class","toc-anchor"),n.innerHTML="# ",t.parentNode.insertBefore(n,t)})}document.addEventListener("DOMContentLoaded",(function(){addAnchorsToTerms()}));
|
|
122
122
|
function copyAnchorToCliboard(){document.addEventListener("click",(function(o){if(o.target.classList.contains("toc-anchor")){const c=o.target.href;navigator.clipboard.writeText(c).then(()=>{console.log("Anchor copied to clipboard"),notyf.success("Anchor copied to clipboard: "+c)}).catch(o=>{console.error("Failed to copy anchor to clipboard",o)})}}))}document.addEventListener("DOMContentLoaded",(function(){copyAnchorToCliboard()}));
|
|
123
123
|
var Notyf=function(){"use strict";var t,i=function(){return(i=Object.assign||function(t){for(var i,e=1,n=arguments.length;e<n;e++)for(var o in i=arguments[e])Object.prototype.hasOwnProperty.call(i,o)&&(t[o]=i[o]);return t}).apply(this,arguments)},e=(n.prototype.on=function(t,i){var e=this.listeners[t]||[];this.listeners[t]=e.concat([i])},n.prototype.triggerEvent=function(t,i){var e=this;(this.listeners[t]||[]).forEach((function(t){return t({target:e,event:i})}))},n);function n(t){this.options=t,this.listeners={}}(s=t=t||{})[s.Add=0]="Add",s[s.Remove=1]="Remove";var o,s,a=(r.prototype.push=function(i){this.notifications.push(i),this.updateFn(i,t.Add,this.notifications)},r.prototype.splice=function(i,e){return e=this.notifications.splice(i,e)[0],this.updateFn(e,t.Remove,this.notifications),e},r.prototype.indexOf=function(t){return this.notifications.indexOf(t)},r.prototype.onUpdate=function(t){this.updateFn=t},r);function r(){this.notifications=[]}(s=o=o||{}).Dismiss="dismiss";var c={types:[{type:"success",className:"notyf__toast--success",backgroundColor:"#3dc763",icon:{className:"notyf__icon--success",tagName:"i"}},{type:"error",className:"notyf__toast--error",backgroundColor:"#ed3d3d",icon:{className:"notyf__icon--error",tagName:"i"}}],duration:2e3,ripple:!0,position:{x:"right",y:"bottom"},dismissible:!(s.Click="click")},p=(d.prototype.on=function(t,e){var n;this.events=i(i({},this.events),((n={})[t]=e,n))},d.prototype.update=function(i,e){e===t.Add?this.addNotification(i):e===t.Remove&&this.removeNotification(i)},d.prototype.removeNotification=function(t){var i,e,n=this;(t=this._popRenderedNotification(t))&&((e=t.node).classList.add("notyf__toast--disappear"),e.addEventListener(this.animationEndEventName,i=function(t){t.target===e&&(e.removeEventListener(n.animationEndEventName,i),n.container.removeChild(e))}))},d.prototype.addNotification=function(t){var i=this._renderNotification(t);this.notifications.push({notification:t,node:i}),this._announce(t.options.message||"Notification")},d.prototype._renderNotification=function(t){var i=this._buildNotificationCard(t),e=t.options.className;return e&&(t=i.classList).add.apply(t,e.split(" ")),this.container.appendChild(i),i},d.prototype._popRenderedNotification=function(t){for(var i=-1,e=0;e<this.notifications.length&&i<0;e++)this.notifications[e].notification===t&&(i=e);if(-1!==i)return this.notifications.splice(i,1)[0]},d.prototype.getXPosition=function(t){return(null===(t=null==t?void 0:t.position)||void 0===t?void 0:t.x)||"right"},d.prototype.getYPosition=function(t){return(null===(t=null==t?void 0:t.position)||void 0===t?void 0:t.y)||"bottom"},d.prototype.adjustContainerAlignment=function(t){var i=this.X_POSITION_FLEX_MAP[this.getXPosition(t)],e=this.Y_POSITION_FLEX_MAP[this.getYPosition(t)];(t=this.container.style).setProperty("justify-content",e),t.setProperty("align-items",i)},d.prototype._buildNotificationCard=function(t){var i=this,e=t.options,n=e.icon;this.adjustContainerAlignment(e);var s=this._createHTMLElement({tagName:"div",className:"notyf__toast"}),a=this._createHTMLElement({tagName:"div",className:"notyf__ripple"}),r=this._createHTMLElement({tagName:"div",className:"notyf__wrapper"}),c=this._createHTMLElement({tagName:"div",className:"notyf__message"});c.innerHTML=e.message||"";var p,d,l,u,f=e.background||e.backgroundColor;return n&&(p=this._createHTMLElement({tagName:"div",className:"notyf__icon"}),("string"==typeof n||n instanceof String)&&(p.innerHTML=new String(n).valueOf()),"object"==typeof n&&(d=n.tagName,l=n.className,u=n.text,n=void 0===(n=n.color)?f:n,u=this._createHTMLElement({tagName:void 0===d?"i":d,className:l,text:u}),n&&(u.style.color=n),p.appendChild(u)),r.appendChild(p)),r.appendChild(c),s.appendChild(r),f&&(e.ripple?(a.style.background=f,s.appendChild(a)):s.style.background=f),e.dismissible&&(a=this._createHTMLElement({tagName:"div",className:"notyf__dismiss"}),f=this._createHTMLElement({tagName:"button",className:"notyf__dismiss-btn"}),a.appendChild(f),r.appendChild(a),s.classList.add("notyf__toast--dismissible"),f.addEventListener("click",(function(e){var n,s;null!==(s=(n=i.events)[o.Dismiss])&&void 0!==s&&s.call(n,{target:t,event:e}),e.stopPropagation()}))),s.addEventListener("click",(function(e){var n,s;return null===(s=(n=i.events)[o.Click])||void 0===s?void 0:s.call(n,{target:t,event:e})})),e="top"===this.getYPosition(e)?"upper":"lower",s.classList.add("notyf__toast--"+e),s},d.prototype._createHTMLElement=function(t){var i=t.tagName,e=t.className;t=t.text,i=document.createElement(i);return e&&(i.className=e),i.textContent=t||null,i},d.prototype._createA11yContainer=function(){var t=this._createHTMLElement({tagName:"div",className:"notyf-announcer"});t.setAttribute("aria-atomic","true"),t.setAttribute("aria-live","polite"),t.style.border="0",t.style.clip="rect(0 0 0 0)",t.style.height="1px",t.style.margin="-1px",t.style.overflow="hidden",t.style.padding="0",t.style.position="absolute",t.style.width="1px",t.style.outline="0",document.body.appendChild(t),this.a11yContainer=t},d.prototype._announce=function(t){var i=this;this.a11yContainer.textContent="",setTimeout((function(){i.a11yContainer.textContent=t}),100)},d.prototype._getAnimationEndEventName=function(){var t,i=document.createElement("_fake"),e={MozTransition:"animationend",OTransition:"oAnimationEnd",WebkitTransition:"webkitAnimationEnd",transition:"animationend"};for(t in e)if(void 0!==i.style[t])return e[t];return"animationend"},d);function d(){this.notifications=[],this.events={},this.X_POSITION_FLEX_MAP={left:"flex-start",center:"center",right:"flex-end"},this.Y_POSITION_FLEX_MAP={top:"flex-start",center:"center",bottom:"flex-end"};var t=document.createDocumentFragment(),i=this._createHTMLElement({tagName:"div",className:"notyf"});t.appendChild(i),document.body.appendChild(t),this.container=i,this.animationEndEventName=this._getAnimationEndEventName(),this._createA11yContainer()}function l(t){var e=this;this.dismiss=this._removeNotification,this.notifications=new a,this.view=new p;var n=this.registerTypes(t);this.options=i(i({},c),t),this.options.types=n,this.notifications.onUpdate((function(t,i){return e.view.update(t,i)})),this.view.on(o.Dismiss,(function(t){var i=t.target;t=t.event;e._removeNotification(i),i.triggerEvent(o.Dismiss,t)})),this.view.on(o.Click,(function(t){var i=t.target;t=t.event;return i.triggerEvent(o.Click,t)}))}return l.prototype.error=function(t){return t=this.normalizeOptions("error",t),this.open(t)},l.prototype.success=function(t){return t=this.normalizeOptions("success",t),this.open(t)},l.prototype.open=function(t){var n=this.options.types.find((function(i){return i.type===t.type}))||{};n=i(i({},n),t);return this.assignProps(["ripple","position","dismissible"],n),n=new e(n),this._pushNotification(n),n},l.prototype.dismissAll=function(){for(;this.notifications.splice(0,1););},l.prototype.assignProps=function(t,i){var e=this;t.forEach((function(t){i[t]=(null==i[t]?e.options:i)[t]}))},l.prototype._pushNotification=function(t){var i=this;this.notifications.push(t);var e=(void 0!==t.options.duration?t:this).options.duration;e&&setTimeout((function(){return i._removeNotification(t)}),e)},l.prototype._removeNotification=function(t){-1!==(t=this.notifications.indexOf(t))&&this.notifications.splice(t,1)},l.prototype.normalizeOptions=function(t,e){return t={type:t},"string"==typeof e?t.message=e:"object"==typeof e&&(t=i(i({},t),e)),t},l.prototype.registerTypes=function(t){var e=(t&&t.types||[]).slice();return c.types.map((function(t){var n=-1;e.forEach((function(i,e){i.type===t.type&&(n=e)}));var o=-1!==n?e.splice(n,1)[0]:{};return i(i({},t),o)})).concat(e)},l}(),notyf=new Notyf({types:[{type:"success",background:"#1D6DAE",duration:3e3},{type:"error",background:"orange",duration:1e7,dismissible:!0}]});
|
|
124
124
|
function showModal(e){const n=document.createElement("div");n.className="modal-overlay";const o=document.createElement("div");o.className="modal";const c=document.createElement("button");function t(){document.body.removeChild(n)}c.className="modal-close",c.innerHTML="×",c.onclick=t,o.innerHTML=e,o.appendChild(c),n.appendChild(o),document.body.appendChild(n),n.onclick=function(e){e.target===n&&t()},document.addEventListener("keydown",(function(e){"Escape"===e.key&&t()}),{once:!0})}
|
|
125
125
|
function tokenInput(){let t=document.createElement("button");t.classList.add("button-token-input"),t.classList.add("btn"),t.innerHTML="🔑",document.querySelector("#container-search-h7vc6omi2hr2880").appendChild(t),t.addEventListener("click",()=>{const t=prompt("Please enter your GitHub token:");t?(localStorage.setItem("githubToken",t),console.log("GitHub token is set.")):alert("GitHub token is not set.")})}document.addEventListener("DOMContentLoaded",(function(){tokenInput()}));
|
|
126
|
-
function pdfDownload(){fetch("index.pdf",{method:"HEAD"}).then(e=>{if(e.ok){let e=document.createElement("a");e.classList.add("button-pdf-download"),e.classList.add("btn"),e.target="_blank",e.rel="noopener noreferrer",e.href="index.pdf",e.title="Download this page as a PDF",e.innerHTML="PDF",document.querySelector("#container-search-h7vc6omi2hr2880").appendChild(e)}else console.
|
|
126
|
+
function pdfDownload(){fetch("index.pdf",{method:"HEAD"}).then(e=>{if(e.ok){let e=document.createElement("a");e.classList.add("button-pdf-download"),e.classList.add("btn"),e.target="_blank",e.rel="noopener noreferrer",e.href="index.pdf",e.title="Download this page as a PDF",e.innerHTML="PDF",document.querySelector("#container-search-h7vc6omi2hr2880").appendChild(e)}else console.log("PDF file does not exist. No PDF download button will be added.")}).catch(e=>{console.error("Error checking PDF file:",e)})}document.addEventListener("DOMContentLoaded",(function(){pdfDownload()}));
|
|
127
127
|
function helpButtons(){const t=document.createElement("a");t.textContent="?",t.classList.add("help-button","btn"),t.title="Click to see the explanation of the buttons at the documentation website, in a new tab.",t.target="_blank",t.rel="noopener noreferrer",t.href="https://blockchainbird.github.io/spec-up-t-website/docs/general/specification#explanation-buttons",function(t){document.querySelectorAll("#content dl dt").forEach(e=>{e.appendChild(t.cloneNode(!0))})}(t)}document.addEventListener("DOMContentLoaded",helpButtons);
|
|
128
128
|
function createAlphabetIndex(){const e=document.getElementById("alphabet-index-h7vc6omi2hr2880"),t=document.querySelector(".terms-and-definitions-list").querySelectorAll("dt"),n={};t.forEach(e=>{const t=e.querySelector("span");if(t&&t.id){const e=t.id,o=e.charAt(e.indexOf("term:")+5).toUpperCase();n[o]||(n[o]=t.id)}});const o=document.createElement("div");o.className="alphabet-index";const r=document.createElement("p");r.className="number-of-terms",r.textContent=`– There are ${t.length} terms –`;const c=e.parentNode;c.insertBefore(r,e.nextSibling),c.insertBefore(o,r.nextSibling),Object.keys(n).sort().forEach(e=>{const t=document.createElement("a");t.href="#"+n[e],t.textContent=e,o.appendChild(t)})}document.addEventListener("DOMContentLoaded",(function(){createAlphabetIndex()}));
|
|
129
129
|
function collapseDefinitions(){const t=document.querySelectorAll("#content dl dd"),e=document.querySelectorAll(".collapse-all-defs-button");document.querySelectorAll("dt").forEach(t=>{const e=document.createElement("button");e.classList.add("collapse-all-defs-button","btn"),e.innerHTML="▲",e.setAttribute("id","toggleButton"),t.appendChild(e)}),document.addEventListener("click",n=>{n.target.classList.contains("collapse-all-defs-button")&&(!function(){const n=t[0].classList.contains("hidden");t.forEach(t=>{t.classList.toggle("hidden",!n),t.classList.toggle("visible",n)}),e.forEach(t=>{t.innerHTML=n?"▲":"▼",t.title=n?"Collapse all definitions":"Expand all definitions"})}(),n.target.scrollIntoView({behavior:"smooth",block:"start",inline:"nearest"}),setTimeout(()=>{window.scrollBy({top:-100,behavior:"smooth"})},500))})}document.addEventListener("DOMContentLoaded",(function(){collapseDefinitions()}));
|
|
@@ -19,7 +19,7 @@ function pdfDownload() {
|
|
|
19
19
|
buttonPdfDownload.innerHTML = "PDF";
|
|
20
20
|
document.querySelector('#container-search-h7vc6omi2hr2880').appendChild(buttonPdfDownload);
|
|
21
21
|
} else {
|
|
22
|
-
console.
|
|
22
|
+
console.log('PDF file does not exist. No PDF download button will be added.');
|
|
23
23
|
}
|
|
24
24
|
})
|
|
25
25
|
.catch(error => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file This file fetches and displays commit hashes by matching elements with `
|
|
2
|
+
* @file This file fetches and displays commit hashes by matching elements with `x-term-reference` class against the `allXrefs` global object.
|
|
3
3
|
* Example:
|
|
4
4
|
* const allXrefs = {
|
|
5
5
|
"xrefs": [
|
|
@@ -26,6 +26,13 @@
|
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
28
|
function fetchCommitHashes() {
|
|
29
|
+
|
|
30
|
+
// Check if allXrefs is undefined or does not exist
|
|
31
|
+
if (typeof allXrefs === 'undefined' || allXrefs === null) {
|
|
32
|
+
console.log('allXrefs is not defined or does not exist. We will continue without it.');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
29
36
|
// Load GitHub API token from local storage if it exists
|
|
30
37
|
const savedToken = localStorage.getItem('githubToken');
|
|
31
38
|
|
|
@@ -108,10 +115,9 @@ function fetchCommitHashes() {
|
|
|
108
115
|
});
|
|
109
116
|
}
|
|
110
117
|
|
|
111
|
-
// get all elements with
|
|
118
|
+
// get all elements with class “x-term-reference”
|
|
112
119
|
const elements = document.querySelectorAll('.x-term-reference');
|
|
113
120
|
|
|
114
|
-
// for each element, get the value of the data-attribute “data-local-href”
|
|
115
121
|
elements.forEach((element) => {
|
|
116
122
|
// Get the value of the data-local-href attribute
|
|
117
123
|
const href = element.getAttribute('data-local-href');
|
package/index.js
CHANGED
|
@@ -52,13 +52,8 @@ module.exports = function(options = {}) {
|
|
|
52
52
|
// Test if xrefs-data.js exists, else make it an empty string
|
|
53
53
|
const inputPath = 'output/xrefs-data.js';
|
|
54
54
|
let xrefsData = "";
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (fs.existsSync(inputPath)) {
|
|
58
|
-
xrefsData = '<script>' + fs.readFileSync(inputPath, 'utf8') + '</script>';
|
|
59
|
-
}
|
|
60
|
-
} catch (error) {
|
|
61
|
-
console.error("\n SPEC-UP-T: " + error + "\n");
|
|
55
|
+
if (fs.existsSync(inputPath)) {
|
|
56
|
+
xrefsData = '<script>' + fs.readFileSync(inputPath, 'utf8') + '</script>';
|
|
62
57
|
}
|
|
63
58
|
|
|
64
59
|
function applyReplacers(doc) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-up-t",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.43",
|
|
4
4
|
"description": "Technical specification drafting tool that generates rich specification documents from markdown. Forked from https://github.com/decentralized-identity/spec-up by Daniel Buchner (https://github.com/csuwildcat)",
|
|
5
5
|
"main": "./index",
|
|
6
6
|
"repository": {
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file json-key-validator.js
|
|
3
|
+
* @description This script validates the presence of required keys in a JSON object loaded from 'specs.json'.
|
|
4
|
+
* It uses synchronous methods to read the file and check the keys. If any required key is missing, it logs an error.
|
|
5
|
+
* The script pauses execution and waits for the user to press ENTER before continuing.
|
|
6
|
+
*
|
|
7
|
+
* @requires fs - File system module to read the JSON file.
|
|
8
|
+
* @requires readline-sync - Module to pause the script and wait for user input.
|
|
9
|
+
*/
|
|
10
|
+
|
|
1
11
|
const fs = require('fs');
|
|
2
12
|
const readlineSync = require('readline-sync');
|
|
3
13
|
|
|
@@ -8,22 +18,27 @@ function pauseForEnterSync() {
|
|
|
8
18
|
readlineSync.question('Press ENTER to continue...');
|
|
9
19
|
}
|
|
10
20
|
|
|
21
|
+
// Load the JSON data from the 'specs.json' file
|
|
11
22
|
function loadData() {
|
|
12
23
|
return JSON.parse(fs.readFileSync('./specs.json', 'utf8'));
|
|
13
24
|
}
|
|
14
25
|
|
|
26
|
+
// This function recursively checks if the required keys are present in the object
|
|
15
27
|
function checkKeysSync(object, expectedKeys, parentKey = '') {
|
|
16
28
|
for (let key of expectedKeys) {
|
|
17
29
|
if (Array.isArray(object)) {
|
|
30
|
+
// If the object is an array, check each item within the array
|
|
18
31
|
for (let [index, item] of object.entries()) {
|
|
19
32
|
checkKeysSync(item, expectedKeys, `${parentKey}[${index}]`);
|
|
20
33
|
}
|
|
21
34
|
} else if (typeof object === 'object') {
|
|
35
|
+
// If the key is missing from the object, log an error
|
|
22
36
|
if (!(key in object)) {
|
|
23
37
|
console.error(`\n SPEC-UP-T: Error: Missing key '${key}' in ${parentKey}\n We cannot guarantee that Spec-Up-T will work properly.\n Here is an example specs.json file:\n https://github.com/blockchainbird/spec-up-t-starter-pack/blob/main/spec-up-t-starterpack/specs.json` + "\n");
|
|
24
38
|
errorFound = true;
|
|
25
|
-
pauseForEnterSync(); // Pause synchronously
|
|
39
|
+
pauseForEnterSync(); // Pause synchronously to allow user to acknowledge the error
|
|
26
40
|
}
|
|
41
|
+
// If the expected key contains nested objects, recursively check for them
|
|
27
42
|
if (typeof expectedKeys[key] === 'object' && object[key]) {
|
|
28
43
|
checkKeysSync(object[key], expectedKeys[key], `${parentKey}.${key}`);
|
|
29
44
|
}
|
|
@@ -31,8 +46,11 @@ function checkKeysSync(object, expectedKeys, parentKey = '') {
|
|
|
31
46
|
}
|
|
32
47
|
}
|
|
33
48
|
|
|
49
|
+
// Main function that runs the validator script
|
|
34
50
|
function runJsonKeyValidatorSync() {
|
|
35
|
-
const data = loadData();
|
|
51
|
+
const data = loadData(); // Load the JSON file data
|
|
52
|
+
|
|
53
|
+
// Define the keys expected in the JSON structure
|
|
36
54
|
const expectedKeys = {
|
|
37
55
|
specs: [
|
|
38
56
|
"title",
|
|
@@ -45,7 +63,7 @@ function runJsonKeyValidatorSync() {
|
|
|
45
63
|
"source",
|
|
46
64
|
"external_specs",
|
|
47
65
|
"external_specs_repos",
|
|
48
|
-
"assets"
|
|
66
|
+
// "assets" // Commented out: We no longer check for 'assets' in the specs object
|
|
49
67
|
],
|
|
50
68
|
source: [
|
|
51
69
|
"host",
|
|
@@ -57,30 +75,38 @@ function runJsonKeyValidatorSync() {
|
|
|
57
75
|
"url",
|
|
58
76
|
"terms_dir"
|
|
59
77
|
],
|
|
60
|
-
assets:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
78
|
+
// Removed the 'assets' block entirely, as it's no longer part of the required keys:
|
|
79
|
+
// assets: [
|
|
80
|
+
// "path",
|
|
81
|
+
// "inject",
|
|
82
|
+
// "module"
|
|
83
|
+
// ]
|
|
65
84
|
};
|
|
66
85
|
|
|
86
|
+
// Iterate over each spec entry in the specs array from the JSON file
|
|
67
87
|
for (let [index, spec] of data.specs.entries()) {
|
|
68
88
|
console.log(`\n SPEC-UP-T: Checking spec #${index + 1}` + "\n");
|
|
89
|
+
|
|
90
|
+
// Check for keys defined in expectedKeys.specs
|
|
69
91
|
checkKeysSync(spec, expectedKeys.specs, `specs[${index}]`);
|
|
70
92
|
|
|
93
|
+
// Check for keys inside the 'source' object, if present
|
|
71
94
|
if (spec.source) {
|
|
72
95
|
checkKeysSync(spec.source, expectedKeys.source, `specs[${index}].source`);
|
|
73
96
|
}
|
|
74
97
|
|
|
98
|
+
// Check for keys inside the 'external_specs_repos' array, if present
|
|
75
99
|
if (spec.external_specs_repos) {
|
|
76
100
|
checkKeysSync(spec.external_specs_repos, expectedKeys.external_specs_repos, `specs[${index}].external_specs_repos`);
|
|
77
101
|
}
|
|
78
102
|
|
|
103
|
+
// The assets check is no longer necessary and has been commented out
|
|
79
104
|
// if (spec.assets) {
|
|
80
105
|
// checkKeysSync(spec.assets, expectedKeys.assets, `specs[${index}].assets`);
|
|
81
106
|
// }
|
|
82
107
|
}
|
|
83
108
|
|
|
109
|
+
// If no errors were found, print a success message
|
|
84
110
|
if (!errorFound) {
|
|
85
111
|
console.log('\n SPEC-UP-T: All keys are present. No errors found. Continuing…' + "\n");
|
|
86
112
|
}
|