diff --git a/Makefile b/Makefile
index a82ab35..d559b3a 100644
--- a/Makefile
+++ b/Makefile
@@ -8,6 +8,9 @@ all: test build
test:
deno test --unstable --allow-read utils/test.js
+format:
+ deno fmt utils/*.js README.md
+
build:
deno run --unstable --allow-read --allow-write utils/build.js
diff --git a/README.md b/README.md
index ed43f86..6c3caed 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,3 @@
-
```
██╗░░░██╗████████╗██╗░░██╗░█████╗░
██║░░░██║╚══██╔══╝╚██╗██╔╝██╔══██╗
@@ -7,55 +6,64 @@
╚██████╔╝░░░██║░░░██╔╝╚██╗╚█████╔╝
░╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░
```
+
> Otevřená komunitní kryptoměnová konference
[![Test, build, deploy](https://github.com/gweicz/utxo/actions/workflows/deploy.yml/badge.svg)](https://github.com/gweicz/utxo/actions/workflows/deploy.yml)
-Tento repozitář obsahuje základní specifikace (datové zdroje) všech ročníků konference.
+Tento repozitář obsahuje základní specifikace (datové zdroje) všech ročníků
+konference.
-Veškeré informace o konferenci naleznete na [docs.utxo.cz](https://docs.utxo.cz).
+Veškeré informace o konferenci naleznete na
+[docs.utxo.cz](https://docs.utxo.cz).
## Specifikace
-* Zdrojové soubory ve formátu [YAML](https://yaml.org/) jsou umístěny v adresáři [`spec`](./spec).
-* Validační schéma ([JSON Schema](https://json-schema.org/)) najdete v adresáři [`utils/schema`](./utils/schema)
+- Zdrojové soubory ve formátu [YAML](https://yaml.org/) jsou umístěny v adresáři
+ [`spec`](./spec).
+- Validační schéma ([JSON Schema](https://json-schema.org/)) najdete v adresáři
+ [`utils/schema`](./utils/schema)
Jako runtime se využívá Javascriptové [Deno](https://deno.land/).
## Ročníky
-| Ročník | Název | Datum konání | Místo |
-| --- | --- | --- | --- |
-| 2022 | **UTXO.22** | 4.-5.6.2022 | Gabriel Loci, Praha |
+| Ročník | Název | Datum konání | Místo |
+| ------ | ----------- | ------------ | ------------------- |
+| 2022 | **UTXO.22** | 4.-5.6.2022 | Gabriel Loci, Praha |
## HTTP Endpoint
-Veřejný HTTP endpoint s datovými soubory ve formátu JSON naleznete na adrese:
+
+Veřejný HTTP endpoint s datovými soubory ve formátu JSON naleznete na adrese:
- [https://spec.utxo.cz/](https://spec.utxo.cz/)
## Datové sady
-| | Popis | Ročník 2022 |
-| --- | --- | --- |
-| **index** | Základní údaje o ročníku | [https://spec.utxo.cz/22/](https://spec.utxo.cz/22/) |
-| **speakers** | Přednášející | [https://spec.utxo.cz/22/speakers.json](https://spec.utxo.cz/22/speakers.json) |
-| **tracks** | Programové sekce | [https://spec.utxo.cz/22/tracks.json](https://spec.utxo.cz/22/tracks.json) |
-| **events** | Události | [https://spec.utxo.cz/22/events.json](https://spec.utxo.cz/22/events.json) |
-| **faqs** | Často kladené dotazy (FAQ) | [https://spec.utxo.cz/22/faqs.json](https://spec.utxo.cz/22/faqs.json) |
+
+| | Popis | Ročník 2022 |
+| ------------ | ------------------------------------------- | ------------------------------------------------------------------------------ |
+| **index** | Základní údaje o ročníku | [https://spec.utxo.cz/22/](https://spec.utxo.cz/22/) |
+| **speakers** | Přednášející | [https://spec.utxo.cz/22/speakers.json](https://spec.utxo.cz/22/speakers.json) |
+| **tracks** | Programové sekce | [https://spec.utxo.cz/22/tracks.json](https://spec.utxo.cz/22/tracks.json) |
+| **events** | Události | [https://spec.utxo.cz/22/events.json](https://spec.utxo.cz/22/events.json) |
+| **faqs** | Často kladené dotazy (FAQ) | [https://spec.utxo.cz/22/faqs.json](https://spec.utxo.cz/22/faqs.json) |
| **partners** | Partneři (sponzoři, mediální partneři atp.) | [https://spec.utxo.cz/22/partners.json](https://spec.utxo.cz/22/partners.json) |
-| **bundle** | Vše v jednom souboru | [https://spec.utxo.cz/22/bundle.json](https://spec.utxo.cz/22/bundle.json) |
+| **bundle** | Vše v jednom souboru | [https://spec.utxo.cz/22/bundle.json](https://spec.utxo.cz/22/bundle.json) |
## Detaily k jednotlivým ročníkům
### UTXO.22
+
> 4.-5. června 2022, Gabriel Loci (Praha)
#### Související repozitáře
-| Repozitář | Popis |
-| --- | --- |
-| [gweicz/utxo22-docs](https://github.com/gweicz/utxo22-docs) | GitBook dokumentace |
+| Repozitář | Popis |
+| ----------------------------------------------------------------- | ------------------------------- |
+| [gweicz/utxo22-docs](https://github.com/gweicz/utxo22-docs) | GitBook dokumentace |
| [gweicz/utxo22-landing](https://github.com/gweicz/utxo22-landing) | Dočasná landing page na utxo.cz |
## Kontakt
-* Web: [utxo.cz](https://utxo.cz)
-* Dokumentace: [docs.utxo.cz](https://docs.utxo.cz)
+
+- Web: [utxo.cz](https://utxo.cz)
+- Dokumentace: [docs.utxo.cz](https://docs.utxo.cz)
diff --git a/utils/build.js b/utils/build.js
index d40b406..13e0160 100644
--- a/utils/build.js
+++ b/utils/build.js
@@ -1,7 +1,6 @@
-import { UTXOEngine } from "./engine.js"
+import { UTXOEngine } from "./engine.js";
-const utxo = new UTXOEngine({ srcDir: './spec' })
-await utxo.init()
-
-await utxo.build('./dist')
+const utxo = new UTXOEngine({ srcDir: "./spec" });
+await utxo.init();
+await utxo.build("./dist");
diff --git a/utils/engine.js b/utils/engine.js
index a4d10a1..db7449d 100644
--- a/utils/engine.js
+++ b/utils/engine.js
@@ -1,8 +1,8 @@
-import { emptyDir, exists } from 'https://deno.land/std@0.119.0/fs/mod.ts'
-import { copy } from 'https://deno.land/std@0.119.0/fs/copy.ts'
-import { load } from 'https://deno.land/x/js_yaml_port@3.14.0/js-yaml.js'
+import { emptyDir, exists } from "https://deno.land/std@0.119.0/fs/mod.ts";
+import { copy } from "https://deno.land/std@0.119.0/fs/copy.ts";
+import { load } from "https://deno.land/x/js_yaml_port@3.14.0/js-yaml.js";
-const baseUrl = 'https://spec.utxo.cz'
+const baseUrl = "https://spec.utxo.cz";
const banner = `
██╗░░░██╗████████╗██╗░░██╗░█████╗░
@@ -11,157 +11,181 @@ const banner = `
██║░░░██║░░░██║░░░░██╔██╗░██║░░██║
╚██████╔╝░░░██║░░░██╔╝╚██╗╚█████╔╝
░╚═════╝░░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░
-`
+`;
export class UTXOEngine {
- constructor (options = {}) {
- this.options = options
- this.srcDir = this.options.srcDir || './spec'
+ constructor(options = {}) {
+ this.options = options;
+ this.srcDir = this.options.srcDir || "./spec";
if (!this.options.silent) {
- console.log(banner)
+ console.log(banner);
}
this.imageTypes = [
- ['web', 'png'],
- ['web', 'webp'],
- ['web', 'jpg'],
- ['sm', 'png'],
- ['sm', 'webp'],
- ['twitter', 'jpg']
- ]
+ ["web", "png"],
+ ["web", "webp"],
+ ["web", "jpg"],
+ ["sm", "png"],
+ ["sm", "webp"],
+ ["twitter", "jpg"],
+ ];
}
- async init () {
- this.entries = {}
+ async init() {
+ this.entries = {};
for await (const f of Deno.readDir(this.srcDir)) {
if (!f.name.match(/^\d+$/)) {
- continue
+ continue;
}
- const specDir = [this.srcDir, f.name].join('/')
+ const specDir = [this.srcDir, f.name].join("/");
- const entry = this.entries[f.name] = {}
+ const entry = this.entries[f.name] = {};
// load index
- entry.index = await this._yamlLoad([specDir, 'index.yaml'].join('/'))
+ entry.index = await this._yamlLoad([specDir, "index.yaml"].join("/"));
// load sub-specs
- entry.specs = {}
+ entry.specs = {};
for (const sp of entry.index.specDef) {
- entry.specs[sp.type] = await this._yamlLoad([specDir, `${sp.type}.yaml`].join('/'))
+ entry.specs[sp.type] = await this._yamlLoad(
+ [specDir, `${sp.type}.yaml`].join("/"),
+ );
// post processing of sub-specs
switch (sp.type) {
- case 'speakers':
- case 'partners':
+ case "speakers":
+ case "partners":
for (const s of entry.specs[sp.type]) {
if (!s.photos) {
- s.photos = []
+ s.photos = [];
}
for (const [it, format] of this.imageTypes) {
- if (await exists([this.srcDir, f.name, 'photos', sp.type, `${s.id}-${it}.${format}`].join('/'))) {
- s.photos.push(`${it}:${format}`)
+ if (
+ await exists(
+ [
+ this.srcDir,
+ f.name,
+ "photos",
+ sp.type,
+ `${s.id}-${it}.${format}`,
+ ].join("/"),
+ )
+ ) {
+ s.photos.push(`${it}:${format}`);
}
}
}
- if (sp.type === 'speakers') {
- entry.specs[sp.type] = entry.specs[sp.type].sort((x, y) => x.name.localeCompare(y.name))
+ if (sp.type === "speakers") {
+ entry.specs[sp.type] = entry.specs[sp.type].sort((x, y) =>
+ x.name.localeCompare(y.name)
+ );
}
- break
+ break;
}
}
}
if (!this.options.silent) {
- console.log(`UTXO entries: [ ${Object.keys(this.entries).join(', ')} ]\n`)
+ console.log(
+ `UTXO entries: [ ${Object.keys(this.entries).join(", ")} ]\n`,
+ );
}
}
- entriesList () {
- return Object.keys(this.entries)
+ entriesList() {
+ return Object.keys(this.entries);
}
- async build (outputDir) {
- await emptyDir(outputDir)
- const entriesIndex = []
+ async build(outputDir) {
+ await emptyDir(outputDir);
+ const entriesIndex = [];
for (const entryId of Object.keys(this.entries)) {
if (!this.options.silent) {
- console.log(`UTXO.${entryId}: building specs ..`)
+ console.log(`UTXO.${entryId}: building specs ..`);
}
- const entry = this.entries[entryId]
- const entryDir = [outputDir, entryId].join('/')
- await emptyDir(entryDir)
+ const entry = this.entries[entryId];
+ const entryDir = [outputDir, entryId].join("/");
+ await emptyDir(entryDir);
// write sub-specs
- const specEndpoints = {}
+ const specEndpoints = {};
for (const specName of Object.keys(entry.specs)) {
- await this._jsonWrite([entryDir, `${specName}.json`], entry.specs[specName])
- specEndpoints[specName] = `${baseUrl}/${entryId}/${specName}.json`
+ await this._jsonWrite(
+ [entryDir, `${specName}.json`],
+ entry.specs[specName],
+ );
+ specEndpoints[specName] = `${baseUrl}/${entryId}/${specName}.json`;
}
// write index
- const index = JSON.parse(JSON.stringify(entry.index))
- delete index.specDef
- index.spec = specEndpoints
- index.stats = { counts: {} }
+ const index = JSON.parse(JSON.stringify(entry.index));
+ delete index.specDef;
+ index.spec = specEndpoints;
+ index.stats = { counts: {} };
for (const sc of Object.keys(entry.specs)) {
- index.stats.counts[sc] = entry.specs[sc].length
+ index.stats.counts[sc] = entry.specs[sc].length;
}
- index.time = new Date()
+ index.time = new Date();
- await this._jsonWrite([entryDir, 'index.json'], index)
+ await this._jsonWrite([entryDir, "index.json"], index);
// write bundle
- const bundle = JSON.parse(JSON.stringify(index))
- bundle.spec = entry.specs
- await this._jsonWrite([entryDir, 'bundle.json'], bundle)
+ const bundle = JSON.parse(JSON.stringify(index));
+ bundle.spec = entry.specs;
+ await this._jsonWrite([entryDir, "bundle.json"], bundle);
// copy photos
- const outputPhotosDir = [entryDir, 'photos'].join('/')
+ const outputPhotosDir = [entryDir, "photos"].join("/");
if (!this.options.silent) {
- console.log(`UTXO.${entryId}: copying photos ..`)
- console.log(`copying photos to ${outputPhotosDir}`)
+ console.log(`UTXO.${entryId}: copying photos ..`);
+ console.log(`copying photos to ${outputPhotosDir}`);
}
- await copy([this.srcDir, entryId, 'photos'].join('/'), outputPhotosDir, { overwrite: true })
+ await copy([this.srcDir, entryId, "photos"].join("/"), outputPhotosDir, {
+ overwrite: true,
+ });
entriesIndex.push({
id: `utxo${entryId}`,
entryId,
- url: `${baseUrl}/${entryId}`
- })
+ url: `${baseUrl}/${entryId}`,
+ });
}
// write global index
- await this._jsonWrite([outputDir, 'index.json'], entriesIndex)
+ await this._jsonWrite([outputDir, "index.json"], entriesIndex);
if (!this.options.silent) {
- console.log('\nBuild done')
+ console.log("\nBuild done");
}
}
- async schemas () {
- const schemaDir = './utils/schema'
- const arr = []
+ async schemas() {
+ const schemaDir = "./utils/schema";
+ const arr = [];
for await (const f of Deno.readDir(schemaDir)) {
- const m = f.name.match(/^(.+)\.yaml$/)
+ const m = f.name.match(/^(.+)\.yaml$/);
if (!m) {
- continue
+ continue;
}
- arr.push({ name: m[1], schema: await this._yamlLoad([schemaDir, f.name].join('/')) })
+ arr.push({
+ name: m[1],
+ schema: await this._yamlLoad([schemaDir, f.name].join("/")),
+ });
}
- return arr
+ return arr;
}
- async _yamlLoad (fn) {
- return load(await Deno.readTextFile(fn))
+ async _yamlLoad(fn) {
+ return load(await Deno.readTextFile(fn));
}
- async _jsonWrite (fn, data) {
+ async _jsonWrite(fn, data) {
if (Array.isArray(fn)) {
- fn = fn.join('/')
+ fn = fn.join("/");
}
- await Deno.writeTextFile(fn, JSON.stringify(data, null, 2))
+ await Deno.writeTextFile(fn, JSON.stringify(data, null, 2));
if (!this.options.silent) {
- console.log(`${fn} writed`)
+ console.log(`${fn} writed`);
}
- return true
+ return true;
}
}
diff --git a/utils/stats.js b/utils/stats.js
index c7ff26c..de00a1d 100644
--- a/utils/stats.js
+++ b/utils/stats.js
@@ -1,27 +1,30 @@
-import { Table } from "https://deno.land/x/cliffy@v0.20.1/table/mod.ts"
-import { UTXOEngine } from './engine.js'
+import { Table } from "https://deno.land/x/cliffy@v0.20.1/table/mod.ts";
+import { UTXOEngine } from "./engine.js";
-const utxo = new UTXOEngine({ silent: true })
-await utxo.init()
+const utxo = new UTXOEngine({ silent: true });
+await utxo.init();
-const entryId = '22'
-const entry = utxo.entries[entryId]
+const entryId = "22";
+const entry = utxo.entries[entryId];
-const tracksCount = {}
+const tracksCount = {};
for (const sp of entry.specs.speakers) {
for (const tr of sp.tracks) {
if (!tracksCount[tr]) {
- tracksCount[tr] = 0
+ tracksCount[tr] = 0;
}
- tracksCount[tr]++
+ tracksCount[tr]++;
}
}
-const tracks = entry.specs.tracks.map(t => [t.id, '|' + '+'.repeat(tracksCount[t.id] || '0' ) ])
+const tracks = entry.specs.tracks.map(
+ (t) => [t.id, "|" + "+".repeat(tracksCount[t.id] || "0")],
+);
-const table = Table.from(tracks)
+const table = Table.from(tracks);
//table.border(true)
-console.log('\nRozložení jednotlivých tématických sekcí dle přednášejících:\n' + '-'.repeat(60))
-console.log(table.toString() + '\n')
-
-
+console.log(
+ "\nRozložení jednotlivých tématických sekcí dle přednášejících:\n" +
+ "-".repeat(60),
+);
+console.log(table.toString() + "\n");
diff --git a/utils/test.js b/utils/test.js
index c159a81..f814cf8 100644
--- a/utils/test.js
+++ b/utils/test.js
@@ -1,44 +1,42 @@
-import { assertEquals } from "https://deno.land/std@0.119.0/testing/asserts.ts"
-import { UTXOEngine } from './engine.js'
+import { assertEquals } from "https://deno.land/std@0.119.0/testing/asserts.ts";
+import { UTXOEngine } from "./engine.js";
// initialize ajv JSON Schema validator
-import Ajv from 'https://esm.sh/ajv@8.8.1?pin=v58'
-import addFormats from 'https://esm.sh/ajv-formats@2.1.1'
+import Ajv from "https://esm.sh/ajv@8.8.1?pin=v58";
+import addFormats from "https://esm.sh/ajv-formats@2.1.1";
-const ajv = new Ajv()
-addFormats(ajv)
+const ajv = new Ajv();
+addFormats(ajv);
-const utxo = new UTXOEngine({ silent: true })
-await utxo.init()
-const schemas = await utxo.schemas()
+const utxo = new UTXOEngine({ silent: true });
+await utxo.init();
+const schemas = await utxo.schemas();
-const validators = {}
+const validators = {};
for (const item of schemas) {
- validators[item.name] = ajv.compile(item.schema)
+ validators[item.name] = ajv.compile(item.schema);
}
// check entries
for (const entryId of utxo.entriesList()) {
- const entry = utxo.entries[entryId]
+ const entry = utxo.entries[entryId];
// check index
Deno.test(`UTXO.${entryId}: index.yaml`, () => {
-
if (!validators.index(entry.index)) {
- throw validators.index.errors
+ throw validators.index.errors;
}
- })
+ });
// check specific specs
for (const specId of Object.keys(entry.specs)) {
Deno.test(`UTXO.${entryId}: ${specId}`, () => {
-
if (!validators[specId]) {
- return null
+ return null;
}
if (!validators[specId](entry.specs[specId])) {
- throw validators[specId].errors
+ throw validators[specId].errors;
}
- })
+ });
}
}
diff --git a/utils/twitter.js b/utils/twitter.js
index 852a565..650eeb0 100644
--- a/utils/twitter.js
+++ b/utils/twitter.js
@@ -1,94 +1,96 @@
-import { config } from "https://deno.land/x/dotenv/mod.ts"
-import SimpleTwitter from "https://deno.land/x/simple_twitter_deno@0.05/simple_twitter_deno.ts"
-import { Table } from "https://deno.land/x/cliffy@v0.20.1/table/mod.ts"
-import { UTXOEngine } from './engine.js'
-import { exists } from "https://deno.land/std/fs/mod.ts"
-import { fromStreamReader } from "https://deno.land/std@0.60.0/io/streams.ts"
+import { config } from "https://deno.land/x/dotenv/mod.ts";
+import SimpleTwitter from "https://deno.land/x/simple_twitter_deno@0.05/simple_twitter_deno.ts";
+import { Table } from "https://deno.land/x/cliffy@v0.20.1/table/mod.ts";
+import { UTXOEngine } from "./engine.js";
+import { exists } from "https://deno.land/std/fs/mod.ts";
+import { fromStreamReader } from "https://deno.land/std@0.60.0/io/streams.ts";
-const utxo = new UTXOEngine({ silent: true })
-await utxo.init()
+const utxo = new UTXOEngine({ silent: true });
+await utxo.init();
-config({ path: ".env", export: true })
+config({ path: ".env", export: true });
-const twitterImagesPath = './spec/22/photos/speakers/'
-const twitterPartnersImagesPath = './spec/22/photos/partners/'
+const twitterImagesPath = "./spec/22/photos/speakers/";
+const twitterPartnersImagesPath = "./spec/22/photos/partners/";
const simple_twitter = new SimpleTwitter({
consumer_key: Deno.env.get("CONSUMER_KEY"),
consumer_secret: Deno.env.get("CONSUMER_SECRET"),
access_token: Deno.env.get("ACCESS_TOKEN"),
access_token_secret: Deno.env.get("ACCESS_TOKEN_SECRET"),
- bearer_token: Deno.env.get("BEARER_TOKEN")
-})
+ bearer_token: Deno.env.get("BEARER_TOKEN"),
+});
-const entryId = '22'
-const entry = utxo.entries[entryId]
+const entryId = "22";
+const entry = utxo.entries[entryId];
-const arr = []
-let total = 0
+const arr = [];
+let total = 0;
+let items = [];
// partners
for (const sp of entry.specs.partners) {
if (!sp.twitter) {
- continue
+ continue;
}
- const tw = await twitterUser(sp.twitter)
+ const tw = await twitterUser(sp.twitter);
if (!tw) {
- continue
+ continue;
}
- const imageFn = twitterPartnersImagesPath + sp.id + '-twitter.jpg'
+ const imageFn = twitterPartnersImagesPath + sp.id + "-twitter.jpg";
if (!await exists(imageFn)) {
- const url = tw.profile_image_url_https.replace('_normal', '')
- console.log(url)
- const res = await fetch(url)
- const file = await Deno.open(imageFn, { create: true, write: true })
- const reader = fromStreamReader(res.body.getReader())
- await Deno.copy(reader, file)
- file.close()
+ const url = tw.profile_image_url_https.replace("_normal", "");
+ console.log(url);
+ const res = await fetch(url);
+ const file = await Deno.open(imageFn, { create: true, write: true });
+ const reader = fromStreamReader(res.body.getReader());
+ await Deno.copy(reader, file);
+ file.close();
}
- arr.push([ `partner:${sp.type}`, tw.screen_name, tw.followers_count ])
- total += tw.followers_count
+ items.push([`partner:${sp.type}`, tw.screen_name, tw.followers_count]);
+ total += tw.followers_count;
}
// speakers
for (const sp of entry.specs.speakers) {
if (!sp.twitter) {
- continue
+ continue;
}
- const tw = await twitterUser(sp.twitter)
+ const tw = await twitterUser(sp.twitter);
if (!tw) {
- continue
+ continue;
}
- const imageFn = twitterImagesPath + sp.id + '-twitter.jpg'
+ const imageFn = twitterImagesPath + sp.id + "-twitter.jpg";
if (!await exists(imageFn)) {
- const url = tw.profile_image_url_https.replace('_normal', '')
- console.log(url)
- const res = await fetch(url)
- const file = await Deno.open(imageFn, { create: true, write: true })
- const reader = fromStreamReader(res.body.getReader())
- await Deno.copy(reader, file)
- file.close()
+ const url = tw.profile_image_url_https.replace("_normal", "");
+ console.log(url);
+ const res = await fetch(url);
+ const file = await Deno.open(imageFn, { create: true, write: true });
+ const reader = fromStreamReader(res.body.getReader());
+ await Deno.copy(reader, file);
+ file.close();
}
- arr.push([ 'speaker', tw.screen_name, tw.followers_count ])
- total += tw.followers_count
+ items.push(["speaker", tw.screen_name, Number(tw.followers_count)]);
+ total += tw.followers_count;
}
-arr.push([])
-arr.push([ 'total', total ])
+arr.push(...items.sort((x, y) => x[2] < y[2] ? 1 : -1));
-const table = Table.from(arr)
-console.log('\nTwitter followers count:\n\n' + table.toString() + '\n')
+arr.push([]);
+arr.push(["total", "", total]);
+
+const table = Table.from(arr);
+console.log("\nTwitter followers count:\n\n" + table.toString() + "\n");
async function twitterUser(screen_name) {
- const resp = await simple_twitter.get("users/lookup", { screen_name })
+ const resp = await simple_twitter.get("users/lookup", { screen_name });
if (resp.length === 1) {
- return resp[0]
+ return resp[0];
}
- return null
+ return null;
}
-
diff --git a/utils/update-docs.js b/utils/update-docs.js
index 52dce4f..239345e 100644
--- a/utils/update-docs.js
+++ b/utils/update-docs.js
@@ -1,142 +1,181 @@
-import { UTXOEngine } from "./engine.js"
-import { markdownTable } from 'https://cdn.skypack.dev/markdown-table@3?dts'
+import { UTXOEngine } from "./engine.js";
+import { markdownTable } from "https://cdn.skypack.dev/markdown-table@3?dts";
-const utxo = new UTXOEngine({ silent: true })
-await utxo.init()
+const utxo = new UTXOEngine({ silent: true });
+await utxo.init();
// get 2022
-const entry = utxo.entries['22']
+const entry = utxo.entries["22"];
// SPEAKERS
-const speakers = entry.specs.speakers
-const sortedSpeakers = speakers.sort((a, b) => a.name.localeCompare(b.name))
-const tracks = entry.specs.tracks
+const speakers = entry.specs.speakers;
+const sortedSpeakers = speakers.sort((a, b) => a.name.localeCompare(b.name));
+const tracks = entry.specs.tracks;
const methods = {
-
// SPEAKERS - table
- async speakersTableGen () {
-
- const speakersTableArr = [[ 'Jméno', 'Organizace' ]]
+ async speakersTableGen() {
+ const speakersTableArr = [["Jméno", "Organizace"]];
for (const speaker of sortedSpeakers) {
- const name = `**${speaker.name}**`
- speakersTableArr.push([
- (speaker.twitter ? `[${name}](https://twitter.com/${speaker.twitter})` : name) + (speaker.nickname ? ` (${speaker.nickname})` : ''),
- speaker.orgs ? speaker.orgs.trim() : ''
- ])
+ const name = `**${speaker.name}**`;
+ speakersTableArr.push([
+ (speaker.twitter
+ ? `[${name}](https://twitter.com/${speaker.twitter})`
+ : name) + (speaker.nickname ? ` (${speaker.nickname})` : ""),
+ speaker.orgs ? speaker.orgs.trim() : "",
+ ]);
}
- const speakersTable = `Celkem přednášejících: **${speakers.length}**\n\n_(abecedně)_\n\n` + markdownTable(speakersTableArr)
+ const speakersTable =
+ `Celkem přednášejících: **${speakers.length}**\n\n_(abecedně)_\n\n` +
+ markdownTable(speakersTableArr);
//console.log(speakersTable)
- return speakersTable
+ return speakersTable;
},
// SPEAKERS - leads
- async speakersLeadsGen () {
-
- const speakersLeadsArr = []
- for (const speaker of sortedSpeakers.filter(speaker => speaker.lead)) {
- const orgs = speaker.orgs ? `\n* ${speaker.orgs.trim('\n')}` : ''
- const socials = []
+ async speakersLeadsGen() {
+ const speakersLeadsArr = [];
+ for (const speaker of sortedSpeakers.filter((speaker) => speaker.lead)) {
+ const orgs = speaker.orgs ? `\n* ${speaker.orgs.trim("\n")}` : "";
+ const socials = [];
if (speaker.twitter) {
- socials.push(`Twitter: [@${speaker.twitter}](https://twitter.com/${speaker.twitter})`)
+ socials.push(
+ `Twitter: [@${speaker.twitter}](https://twitter.com/${speaker.twitter})`,
+ );
}
if (speaker.web) {
- socials.push(`Web: [${speaker.web.name ? speaker.web.name : speaker.name}](${speaker.web.url})`)
+ socials.push(
+ `Web: [${
+ speaker.web.name ? speaker.web.name : speaker.name
+ }](${speaker.web.url})`,
+ );
}
- const img = `![](https://spec.utxo.cz/22/photos/speakers/${speaker.id}-sm.png)`
- const item = `### ${img} ${speaker.name}\n\n* ${speaker.bio.trim()}${orgs}\n* ${socials.join(', ')}`;
- speakersLeadsArr.push(item)
+ const img =
+ `![](https://spec.utxo.cz/22/photos/speakers/${speaker.id}-sm.png)`;
+ const item =
+ `### ${img} ${speaker.name}\n\n* ${speaker.bio.trim()}${orgs}\n* ${
+ socials.join(", ")
+ }`;
+ speakersLeadsArr.push(item);
}
- const speakersLeads = `_(abecedně)_\n\n` + speakersLeadsArr.join('\n\n')
+ const speakersLeads = `_(abecedně)_\n\n` + speakersLeadsArr.join("\n\n");
//console.log(speakersLeads)
- return speakersLeads
+ return speakersLeads;
},
// SPEAKERS - write file
- async speakersBuild () {
- const speakersDocFile = './docs/prednasejici.md'
- const speakersText = await Deno.readTextFile(speakersDocFile)
- let output = speakersText
- output = output.replace(/## Významní hosté([\s\S]+)## Seznam/m, `## Významní hosté\n\n${await methods.speakersLeadsGen()}\n\n## Seznam`)
- output = output.replace(/## Seznam všech přednášejících([\s\S]+)### Datový/m, `## Seznam všech přednášejících\n\n${await methods.speakersTableGen()}\n\n### Datový`)
- await Deno.writeTextFile(speakersDocFile, output)
+ async speakersBuild() {
+ const speakersDocFile = "./docs/prednasejici.md";
+ const speakersText = await Deno.readTextFile(speakersDocFile);
+ let output = speakersText;
+ output = output.replace(
+ /## Významní hosté([\s\S]+)## Seznam/m,
+ `## Významní hosté\n\n${await methods.speakersLeadsGen()}\n\n## Seznam`,
+ );
+ output = output.replace(
+ /## Seznam všech přednášejících([\s\S]+)### Datový/m,
+ `## Seznam všech přednášejících\n\n${await methods
+ .speakersTableGen()}\n\n### Datový`,
+ );
+ await Deno.writeTextFile(speakersDocFile, output);
},
// TRACKS
- async tracksGen () {
-
- const output = []
+ async tracksGen() {
+ const output = [];
for (const track of tracks) {
- output.push(`\n\n${track.name}
\n\n${track.examples.trim()}\n\n `)
+ output.push(
+ `\n\n${track.name}
\n\n${track.examples.trim()}\n\n `,
+ );
}
- return `Přednášky a workshopy budou rozděleny do **${tracks.length} tématických programových sekcí**. Níže naleznete jejich přehled a relevantní příklady.\n\n` + output.join('\n\n')
+ return `Přednášky a workshopy budou rozděleny do **${tracks.length} tématických programových sekcí**. Níže naleznete jejich přehled a relevantní příklady.\n\n` +
+ output.join("\n\n");
},
- async tracksBuild () {
- const sourceFile = './docs/hlavni-program.md'
- const sourceText = await Deno.readTextFile(sourceFile)
- let output = sourceText
- output = output.replace(/## Programové sekce([\s\S]+)## Časová/m, `## Programové sekce\n\n${await methods.tracksGen()}\n\n## Časová`)
- await Deno.writeTextFile(sourceFile, output)
+ async tracksBuild() {
+ const sourceFile = "./docs/hlavni-program.md";
+ const sourceText = await Deno.readTextFile(sourceFile);
+ let output = sourceText;
+ output = output.replace(
+ /## Programové sekce([\s\S]+)## Časová/m,
+ `## Programové sekce\n\n${await methods.tracksGen()}\n\n## Časová`,
+ );
+ await Deno.writeTextFile(sourceFile, output);
},
// FAQs
- async faqsGen () {
- const output = []
+ async faqsGen() {
+ const output = [];
for (const item of entry.specs.faqs) {
- output.push(`\n\n${item.question.trim()}
\n\n${item.answer.trim()}\n\n `)
+ output.push(
+ `\n\n${item.question.trim()}
\n\n${item.answer.trim()}\n\n `,
+ );
}
- return output.join("\n\n")
+ return output.join("\n\n");
},
- async faqsBuild () {
- const docFile = './docs/faq.md'
- const docText = await Deno.readTextFile(docFile)
- const faqs = await this.faqsGen()
- let output = docText
- output = output.replace(/# FAQ[\s\S]+/m, `# FAQ\n\n${faqs}\n`)
+ async faqsBuild() {
+ const docFile = "./docs/faq.md";
+ const docText = await Deno.readTextFile(docFile);
+ const faqs = await this.faqsGen();
+ let output = docText;
+ output = output.replace(/# FAQ[\s\S]+/m, `# FAQ\n\n${faqs}\n`);
// TODO replace
- await Deno.writeTextFile(docFile, output)
+ await Deno.writeTextFile(docFile, output);
},
// PARTNERS
- async partnersGen (type = 'community') {
- const arr = [[ 'Název', 'Popis' ]]
- for (const item of entry.specs.partners.filter(p => p.type === type)) {
- arr.push([ `[**${item.name}**](${item.twitter ? 'https://twitter.com/'+item.twitter : item.web?.url})`, item.desc ])
+ async partnersGen(type = "community") {
+ const arr = [["Název", "Popis"]];
+ for (const item of entry.specs.partners.filter((p) => p.type === type)) {
+ arr.push([
+ `[**${item.name}**](${
+ item.twitter ? "https://twitter.com/" + item.twitter : item.web?.url
+ })`,
+ item.desc,
+ ]);
}
- const table = markdownTable(arr)
- return table
+ const table = markdownTable(arr);
+ return table;
},
- async partnersBuild () {
- const docFile = './docs/partneri.md'
- const docText = await Deno.readTextFile(docFile)
- let output = docText
- output = output.replace(/## Spolupracující komunity([\s\S]+)## Mediální/m, `## Spolupracující komunity\n\n${await methods.partnersGen('community')}\n\n## Mediální`)
- output = output.replace(/## Mediální partneři([\s\S]+)/m, `## Mediální partneři\n\n${await methods.partnersGen('medium')}\n\n`)
- await Deno.writeTextFile(docFile, output)
+ async partnersBuild() {
+ const docFile = "./docs/partneri.md";
+ const docText = await Deno.readTextFile(docFile);
+ let output = docText;
+ output = output.replace(
+ /## Spolupracující komunity([\s\S]+)## Mediální/m,
+ `## Spolupracující komunity\n\n${await methods.partnersGen(
+ "community",
+ )}\n\n## Mediální`,
+ );
+ output = output.replace(
+ /## Mediální partneři([\s\S]+)/m,
+ `## Mediální partneři\n\n${await methods.partnersGen("medium")}\n\n`,
+ );
+ await Deno.writeTextFile(docFile, output);
- const docFile2 = './docs/sponzori.md'
- const docText2 = await Deno.readTextFile(docFile2)
- let output2 = docText2
- output2 = output2.replace(/## Seznam sponzorů([\s\S]+)/m, `## Seznam sponzorů\n\n${await methods.partnersGen('sponsor')}\n\n`)
- await Deno.writeTextFile(docFile2, output2)
- }
-}
-
+ const docFile2 = "./docs/sponzori.md";
+ const docText2 = await Deno.readTextFile(docFile2);
+ let output2 = docText2;
+ output2 = output2.replace(
+ /## Seznam sponzorů([\s\S]+)/m,
+ `## Seznam sponzorů\n\n${await methods.partnersGen("sponsor")}\n\n`,
+ );
+ await Deno.writeTextFile(docFile2, output2);
+ },
+};
if (!Deno.args[0]) {
- await methods.speakersBuild()
- await methods.tracksBuild()
- await methods.faqsBuild()
- await methods.partnersBuild()
- console.log('done')
+ await methods.speakersBuild();
+ await methods.tracksBuild();
+ await methods.faqsBuild();
+ await methods.partnersBuild();
+ console.log("done");
} else {
- console.log(await methods[Deno.args[0]](Deno.args[1]))
+ console.log(await methods[Deno.args[0]](Deno.args[1]));
}
-