Well this was fun
This commit is contained in:
parent
012e34e882
commit
38c09ce24e
6 changed files with 126 additions and 18 deletions
|
@ -51,7 +51,9 @@ export default () => {
|
||||||
let imageLink = "";
|
let imageLink = "";
|
||||||
|
|
||||||
for (const link of links) {
|
for (const link of links) {
|
||||||
if (link.image) imageLink = `<img alt="${link.title}" src="${link.image}"/>`;
|
if (link.image)
|
||||||
|
imageLink = `<img alt="${link.title}" src="${link.image}"/>`;
|
||||||
|
|
||||||
renderedLinks.push(returnLinkTemplate(link.href, link.title, imageLink));
|
renderedLinks.push(returnLinkTemplate(link.href, link.title, imageLink));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,8 @@ function slugify(stringToSlugify) {
|
||||||
.replace(/\)/g, "")
|
.replace(/\)/g, "")
|
||||||
.replace(/,/g, "");
|
.replace(/,/g, "");
|
||||||
|
|
||||||
if (finalString.match(numberRegex)) finalString = `_${finalString}`;
|
if (finalString.match(numberRegex))
|
||||||
|
finalString = `_${finalString}`;
|
||||||
|
|
||||||
return `#${finalString}`;
|
return `#${finalString}`;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,10 +16,17 @@ import config from "@root/config";
|
||||||
|
|
||||||
export default (state, emit) => {
|
export default (state, emit) => {
|
||||||
const newMetadata = state.lbry;
|
const newMetadata = state.lbry;
|
||||||
const description = newMetadata && newMetadata.description ? newMetadata.description : config.meta.description;
|
const description = newMetadata && newMetadata.description ?
|
||||||
const title = newMetadata && newMetadata.title ? newMetadata.title + " - lbry.tech" : "lbry.tech - " + config.meta.tagline;
|
newMetadata.description :
|
||||||
|
config.meta.description;
|
||||||
|
|
||||||
|
const title = newMetadata && newMetadata.title ?
|
||||||
|
newMetadata.title + " - lbry.tech" :
|
||||||
|
"lbry.tech - " + config.meta.tagline;
|
||||||
|
|
||||||
|
if (state.title !== title)
|
||||||
|
emit(state.events.DOMTITLECHANGE, title);
|
||||||
|
|
||||||
if (state.title !== title) emit(state.events.DOMTITLECHANGE, title);
|
|
||||||
state.page = state.page || { };
|
state.page = state.page || { };
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
|
|
12
app/dist/scripts/api.js
vendored
12
app/dist/scripts/api.js
vendored
|
@ -1,10 +1,14 @@
|
||||||
"use strict"; /* global document, Jets */
|
"use strict"; /* global document, Jets, window */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Initiate search functionality
|
// Initiate search functionality
|
||||||
|
const contentTag = window.location.pathname.split("/").pop() === "sdk" ?
|
||||||
|
".api-toc__section" :
|
||||||
|
"#toc";
|
||||||
|
|
||||||
let jets = new Jets({
|
let jets = new Jets({
|
||||||
contentTag: "#toc",
|
contentTag,
|
||||||
searchTag: "#input-search"
|
searchTag: "#input-search"
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -15,7 +19,6 @@ document.getElementById("input-search").value = "";
|
||||||
document.getElementById("input-search").addEventListener("keyup", () => {
|
document.getElementById("input-search").addEventListener("keyup", () => {
|
||||||
if (document.getElementById("input-search").value)
|
if (document.getElementById("input-search").value)
|
||||||
document.querySelector(".api-toc__search-clear").classList.add("active");
|
document.querySelector(".api-toc__search-clear").classList.add("active");
|
||||||
|
|
||||||
else
|
else
|
||||||
document.querySelector(".api-toc__search-clear").classList.remove("active");
|
document.querySelector(".api-toc__search-clear").classList.remove("active");
|
||||||
});
|
});
|
||||||
|
@ -24,6 +27,7 @@ document.getElementById("input-search").addEventListener("keyup", () => {
|
||||||
document.querySelector(".api-toc__search-clear").addEventListener("click", () => {
|
document.querySelector(".api-toc__search-clear").addEventListener("click", () => {
|
||||||
document.getElementById("input-search").value = "";
|
document.getElementById("input-search").value = "";
|
||||||
document.querySelector(".api-toc__search-clear").classList.remove("active");
|
document.querySelector(".api-toc__search-clear").classList.remove("active");
|
||||||
|
|
||||||
jets.destroy();
|
jets.destroy();
|
||||||
reinitJets();
|
reinitJets();
|
||||||
});
|
});
|
||||||
|
@ -55,7 +59,7 @@ function handleApiLanguageToggles(language) {
|
||||||
|
|
||||||
function reinitJets() {
|
function reinitJets() {
|
||||||
jets = new Jets({
|
jets = new Jets({
|
||||||
contentTag: "#toc",
|
contentTag,
|
||||||
searchTag: "#input-search"
|
searchTag: "#input-search"
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.api-toc__items {
|
.api-toc__title {
|
||||||
|
padding: 0.25rem 0.5rem 0.25rem 0.75rem;
|
||||||
|
opacity: 0.3;
|
||||||
|
pointer-events: none;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.api-toc__commands {
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
line-height: 1.33;
|
line-height: 1.33;
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
|
@ -85,7 +92,7 @@
|
||||||
padding-bottom: 1rem;
|
padding-bottom: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.api-toc__item {
|
.api-toc__command {
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $lbry-gray-2;
|
background-color: $lbry-gray-2;
|
||||||
}
|
}
|
||||||
|
@ -215,6 +222,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.api-content__body-argument {
|
.api-content__body-argument {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
&:not(:last-of-type) {
|
&:not(:last-of-type) {
|
||||||
border-bottom: 1px solid $lbry-gray-2;
|
border-bottom: 1px solid $lbry-gray-2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,7 @@ import redirects from "@data/redirects.json";
|
||||||
|
|
||||||
const blockchainApi = "https://cdn.jsdelivr.net/gh/lbryio/lbrycrd@master/contrib/devtools/generated/api_v1.json";
|
const blockchainApi = "https://cdn.jsdelivr.net/gh/lbryio/lbrycrd@master/contrib/devtools/generated/api_v1.json";
|
||||||
const cache = new Map();
|
const cache = new Map();
|
||||||
const sdkApi = process.env.NODE_ENV === "development" ?
|
const sdkApi = "https://cdn.jsdelivr.net/gh/lbryio/lbry@api_doc_categories/docs/api.json";
|
||||||
"https://cdn.jsdelivr.net/gh/lbryio/lbry@generate_examples/docs/api.json" : // TODO: Remove when `generate_examples` is merged into master
|
|
||||||
"https://cdn.jsdelivr.net/gh/lbryio/lbry@master/docs/api.json";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,7 +24,9 @@ const sdkApi = process.env.NODE_ENV === "development" ?
|
||||||
|
|
||||||
export default async(state) => {
|
export default async(state) => {
|
||||||
// below is evil, I just inherited it -- Jeremy
|
// below is evil, I just inherited it -- Jeremy
|
||||||
const apilabel = state.params.wildcard == "sdk" ? "SDK" : state.params.wildcard.charAt(0).toLocaleUpperCase() + state.params.wildcard.substring(1);
|
const apilabel = state.params.wildcard === "sdk" ?
|
||||||
|
"SDK" :
|
||||||
|
state.params.wildcard.charAt(0).toLocaleUpperCase() + state.params.wildcard.substring(1);
|
||||||
|
|
||||||
state.lbry = {
|
state.lbry = {
|
||||||
title: apilabel + " API Documentation",
|
title: apilabel + " API Documentation",
|
||||||
|
@ -45,7 +45,9 @@ export default async(state) => {
|
||||||
<ul class="api-toc__search-results"></ul>
|
<ul class="api-toc__search-results"></ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="api-toc__items" id="toc" role="navigation">${createApiSidebar(apiResponse)}</ul>
|
<ul class="api-toc__commands" id="toc" role="navigation">
|
||||||
|
${apilabel === "SDK" ? createSdkSidebar(apiResponse) : createApiSidebar(apiResponse)}
|
||||||
|
</ul>
|
||||||
</aside>
|
</aside>
|
||||||
<section class="api-content">
|
<section class="api-content">
|
||||||
<div class="api-documentation" id="toc-content">
|
<div class="api-documentation" id="toc-content">
|
||||||
|
@ -57,7 +59,7 @@ export default async(state) => {
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
${createApiHeader(state.params.wildcard)}
|
${createApiHeader(state.params.wildcard)}
|
||||||
${createApiContent(apiResponse)}
|
${apilabel === "SDK" ? createSdkContent(apiResponse) : createApiContent(apiResponse)}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
@ -150,7 +152,7 @@ function createApiSidebar(apiDetails) {
|
||||||
|
|
||||||
for (const apiDetail of apiDetails) {
|
for (const apiDetail of apiDetails) {
|
||||||
apiSidebar.push(`
|
apiSidebar.push(`
|
||||||
<li class="api-toc__item">
|
<li class="api-toc__command">
|
||||||
<a href="#${apiDetail.name}" title="Go to ${apiDetail.name} section">
|
<a href="#${apiDetail.name}" title="Go to ${apiDetail.name} section">
|
||||||
${apiDetail.name}
|
${apiDetail.name}
|
||||||
</a>
|
</a>
|
||||||
|
@ -161,6 +163,69 @@ function createApiSidebar(apiDetails) {
|
||||||
return apiSidebar;
|
return apiSidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createSdkContent(apiDetails) {
|
||||||
|
const apiContent = [];
|
||||||
|
const sectionTitles = Object.keys(apiDetails);
|
||||||
|
|
||||||
|
for (const title of sectionTitles) {
|
||||||
|
const commands = apiDetails[title].commands;
|
||||||
|
const description = apiDetails[title].doc;
|
||||||
|
|
||||||
|
apiContent.push(
|
||||||
|
commands.length ?
|
||||||
|
commands.map(command => createSdkContentSections(title, description, command)).join("") :
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return apiContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSdkContentSections(sectionTitle, sectionDescription, sectionDetails) {
|
||||||
|
/*
|
||||||
|
<h2 id="${sectionTitle}">${sectionTitle}</h2>
|
||||||
|
<p>${sectionDescription}</p>
|
||||||
|
<hr/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="api-content__body">
|
||||||
|
<h2 id="${sectionDetails.name}">${sectionDetails.name}</h2>
|
||||||
|
<p>${sectionDetails.description}</p>
|
||||||
|
|
||||||
|
<h3>Arguments</h3>
|
||||||
|
<ul class="api-content__body-arguments">
|
||||||
|
${renderArguments(sectionDetails.arguments).join("")}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Returns</h3>
|
||||||
|
<pre><code>${renderReturns(sectionDetails.returns)}</code></pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="api-content__example">
|
||||||
|
${renderExamples(sectionDetails.examples).join("")}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createSdkSidebar(apiDetails) {
|
||||||
|
const sectionTitles = Object.keys(apiDetails);
|
||||||
|
const apiSidebar = [];
|
||||||
|
|
||||||
|
for (const title of sectionTitles) {
|
||||||
|
const commands = apiDetails[title].commands;
|
||||||
|
|
||||||
|
apiSidebar.push(`
|
||||||
|
<ul class="api-toc__section">
|
||||||
|
<li class="api-toc__title">${title}</li>
|
||||||
|
${(commands.map(command => `<li class="api-toc__command"><a href="#${command.name}" title="Go to ${command.name} section">${command.name}</a></li>`)).join("")}
|
||||||
|
</ul>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return apiSidebar;
|
||||||
|
}
|
||||||
|
|
||||||
async function parseApiFile(urlSlug) {
|
async function parseApiFile(urlSlug) {
|
||||||
let apiFileLink;
|
let apiFileLink;
|
||||||
|
|
||||||
|
@ -192,6 +257,9 @@ async function parseApiFile(urlSlug) {
|
||||||
function renderArguments(args) {
|
function renderArguments(args) {
|
||||||
const argumentContent = [];
|
const argumentContent = [];
|
||||||
|
|
||||||
|
if (!args || args.length === 0)
|
||||||
|
return argumentContent;
|
||||||
|
|
||||||
for (const arg of args) {
|
for (const arg of args) {
|
||||||
argumentContent.push(`
|
argumentContent.push(`
|
||||||
<li class="api-content__body-argument">
|
<li class="api-content__body-argument">
|
||||||
|
@ -211,6 +279,11 @@ function renderArguments(args) {
|
||||||
function renderExamples(args) {
|
function renderExamples(args) {
|
||||||
const exampleContent = [];
|
const exampleContent = [];
|
||||||
|
|
||||||
|
if (!args || args.length === 0) {
|
||||||
|
exampleContent.push("<pre><code>// example(s) to come later</code></pre>");
|
||||||
|
return exampleContent;
|
||||||
|
}
|
||||||
|
|
||||||
for (const arg of args) {
|
for (const arg of args) {
|
||||||
exampleContent.push(`
|
exampleContent.push(`
|
||||||
<h3>${arg.title}</h3><br/>
|
<h3>${arg.title}</h3><br/>
|
||||||
|
@ -220,8 +293,19 @@ function renderExamples(args) {
|
||||||
|
|
||||||
<h3>Output</h3><br/>
|
<h3>Output</h3><br/>
|
||||||
<pre><code>${arg.output}</code></pre>
|
<pre><code>${arg.output}</code></pre>
|
||||||
|
<hr/>
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exampleContent;
|
return exampleContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderReturns(args) {
|
||||||
|
let returnContent = [];
|
||||||
|
|
||||||
|
if (!args || args.length === 0)
|
||||||
|
return returnContent;
|
||||||
|
|
||||||
|
returnContent = dedent(JSON.parse(JSON.stringify(args)));
|
||||||
|
return returnContent;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue