From 361802273d1cd8cfd56cf97f260e62e3174fdb75 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 26 Jul 2021 18:21:19 +0100 Subject: [PATCH] Doc: Added sponsors and automatically build sponsor list on README --- .eslintignore | 3 ++ .gitignore | 3 ++ .../images/sponsors/HostingDe.png | Bin 0 -> 23078 bytes README.md | 16 ++++--- docs/images/sponsors/HostingDe.png | Bin 0 -> 23078 bytes packages/lib/ArrayUtils.js | 11 +++++ packages/lib/array.ts | 16 +++++++ packages/tools/sponsors.json | 10 ++++ packages/tools/update-readme-sponsors.ts | 43 +++++++++++++----- packages/tools/website/build.ts | 12 +++-- packages/tools/website/utils/types.ts | 5 +- 11 files changed, 96 insertions(+), 23 deletions(-) create mode 100644 Assets/WebsiteAssets/images/sponsors/HostingDe.png create mode 100644 docs/images/sponsors/HostingDe.png create mode 100644 packages/lib/array.ts diff --git a/.eslintignore b/.eslintignore index db0300d396..27b2a4722b 100644 --- a/.eslintignore +++ b/.eslintignore @@ -867,6 +867,9 @@ packages/lib/Synchronizer.js.map packages/lib/TaskQueue.d.ts packages/lib/TaskQueue.js packages/lib/TaskQueue.js.map +packages/lib/array.d.ts +packages/lib/array.js +packages/lib/array.js.map packages/lib/commands/historyBackward.d.ts packages/lib/commands/historyBackward.js packages/lib/commands/historyBackward.js.map diff --git a/.gitignore b/.gitignore index 2aa5a343a9..a655bb7a2b 100644 --- a/.gitignore +++ b/.gitignore @@ -852,6 +852,9 @@ packages/lib/Synchronizer.js.map packages/lib/TaskQueue.d.ts packages/lib/TaskQueue.js packages/lib/TaskQueue.js.map +packages/lib/array.d.ts +packages/lib/array.js +packages/lib/array.js.map packages/lib/commands/historyBackward.d.ts packages/lib/commands/historyBackward.js packages/lib/commands/historyBackward.js.map diff --git a/Assets/WebsiteAssets/images/sponsors/HostingDe.png b/Assets/WebsiteAssets/images/sponsors/HostingDe.png new file mode 100644 index 0000000000000000000000000000000000000000..c381da40c6cbc75fbadbb1b12df174cd28e3bcfd GIT binary patch literal 23078 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%0Af>pnPz(o@+;?OhD`Pr%% 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index de45c1e71d..c7a356555b 100644 --- a/README.md +++ b/README.md @@ -64,19 +64,21 @@ The Web Clipper is a browser extension that allows you to save web pages and scr # Sponsors - + + + * * * - + | | | | | | :---: | :---: | :---: | :---: | |
[avanderberg](https://github.com/avanderberg) |
[c-nagy](https://github.com/c-nagy) |
[cabottech](https://github.com/cabottech) |
[chr15m](https://github.com/chr15m) | -|
[chrootlogin](https://github.com/chrootlogin) |
[dbrandonjohnson](https://github.com/dbrandonjohnson) |
[fbloise](https://github.com/fbloise) |
[h4sh5](https://github.com/h4sh5) | -|
[Jesssullivan](https://github.com/Jesssullivan) |
[joesfer](https://github.com/joesfer) |
[konishi-t](https://github.com/konishi-t) |
[maxtruxa](https://github.com/maxtruxa) | -|
[mcejp](https://github.com/mcejp) |
[nicholashead](https://github.com/nicholashead) |
[piccobit](https://github.com/piccobit) |
[ravenscroftj](https://github.com/ravenscroftj) | -|
[thismarty](https://github.com/thismarty) |
[thomasbroussard](https://github.com/thomasbroussard) | | | - +|
[chrootlogin](https://github.com/chrootlogin) |
[clmntsl](https://github.com/clmntsl) |
[dbrandonjohnson](https://github.com/dbrandonjohnson) |
[fbloise](https://github.com/fbloise) | +|
[h4sh5](https://github.com/h4sh5) |
[Jesssullivan](https://github.com/Jesssullivan) |
[joesfer](https://github.com/joesfer) |
[konishi-t](https://github.com/konishi-t) | +|
[maxtruxa](https://github.com/maxtruxa) |
[mcejp](https://github.com/mcejp) |
[nicholashead](https://github.com/nicholashead) |
[piccobit](https://github.com/piccobit) | +|
[ravenscroftj](https://github.com/ravenscroftj) |
[thismarty](https://github.com/thismarty) |
[thomasbroussard](https://github.com/thomasbroussard) | | + # Table of contents diff --git a/docs/images/sponsors/HostingDe.png b/docs/images/sponsors/HostingDe.png new file mode 100644 index 0000000000000000000000000000000000000000..c381da40c6cbc75fbadbb1b12df174cd28e3bcfd GIT binary patch literal 23078 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%0Af>pnPz(o@+;?OhD`Pr%% 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 literal 0 HcmV?d00001 diff --git a/packages/lib/ArrayUtils.js b/packages/lib/ArrayUtils.js index ba1956aaea..4cb96d6830 100644 --- a/packages/lib/ArrayUtils.js +++ b/packages/lib/ArrayUtils.js @@ -80,4 +80,15 @@ ArrayUtils.mergeOverlappingIntervals = function(intervals, limit) { return stack; }; +ArrayUtils.shuffle = function(array) { + array = array.slice(); + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +}; + module.exports = ArrayUtils; diff --git a/packages/lib/array.ts b/packages/lib/array.ts new file mode 100644 index 0000000000..80fd3c3992 --- /dev/null +++ b/packages/lib/array.ts @@ -0,0 +1,16 @@ +export function shuffle(array: T[]): T[] { + array = array.slice(); + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +} + +export function unique(array: T[]): T[] { + return array.filter(function(elem, index, self) { + return index === self.indexOf(elem); + }); +} diff --git a/packages/tools/sponsors.json b/packages/tools/sponsors.json index daa4e9097a..9b7d5d8925 100644 --- a/packages/tools/sponsors.json +++ b/packages/tools/sponsors.json @@ -71,6 +71,10 @@ { "name": "konishi-t", "id": "24908652" + }, + { + "name": "clmntsl", + "id": "82579431" } ], "orgs": [ @@ -88,6 +92,12 @@ "url": "https://tranio.com/italy/", "title": "Tranio", "imageName": "Tranio.png" + }, + { + "url": "https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-github&mtm_medium=banner", + "urlWebsite": "https://www.hosting.de/nextcloud/?mtm_campaign=managed-nextcloud&mtm_kwd=joplinapp&mtm_source=joplinapp-webseite&mtm_medium=banner", + "title": "Hosting.de", + "imageName": "HostingDe.png" } ] } \ No newline at end of file diff --git a/packages/tools/update-readme-sponsors.ts b/packages/tools/update-readme-sponsors.ts index 10b89c9ec7..a9f1bfd7e1 100644 --- a/packages/tools/update-readme-sponsors.ts +++ b/packages/tools/update-readme-sponsors.ts @@ -1,17 +1,15 @@ import { readFile } from 'fs-extra'; import { insertContentIntoFile, rootDir } from './tool-utils'; import markdownUtils, { MarkdownTableHeader, MarkdownTableJustify, MarkdownTableRow } from '@joplin/lib/markdownUtils'; +const ArrayUtils = require('@joplin/lib/ArrayUtils'); +const { escapeHtml } = require('@joplin/lib/string-utils'); +import { GithubSponsor, OrgSponsor, Sponsors } from './website/utils/types'; const readmePath = `${rootDir}/README.md`; const sponsorsPath = `${rootDir}/packages/tools/sponsors.json`; -interface Sponsor { - name: string; - id: string; -} - -async function main() { - const sponsors: Sponsor[] = (JSON.parse(await readFile(sponsorsPath, 'utf8'))).github; +async function createGitHubSponsorTable(sponsors: GithubSponsor[]): Promise { + sponsors = sponsors.slice(); sponsors.sort((a, b) => { return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : +1; @@ -49,13 +47,36 @@ async function main() { if (!sponsor) break; } - const mdTable = markdownUtils.createMarkdownTable(headers, rows); + return markdownUtils.createMarkdownTable(headers, rows); +} + +async function createOrgSponsorTable(sponsors: OrgSponsor[]): Promise { + sponsors = ArrayUtils.shuffle(sponsors); + + const output: string[] = []; + + for (const sponsor of sponsors) { + output.push(``); + } + + return output.join(' '); +} + +async function main() { + const sponsors: Sponsors = JSON.parse(await readFile(sponsorsPath, 'utf8')); await insertContentIntoFile( readmePath, - '\n', - '\n', - mdTable + '\n', + '\n', + await createGitHubSponsorTable(sponsors.github) + ); + + await insertContentIntoFile( + readmePath, + '\n', + '\n', + await createOrgSponsorTable(sponsors.orgs) ); } diff --git a/packages/tools/website/build.ts b/packages/tools/website/build.ts index 7cdd003f30..af4a3d4727 100644 --- a/packages/tools/website/build.ts +++ b/packages/tools/website/build.ts @@ -2,8 +2,9 @@ import * as fs from 'fs-extra'; import { insertContentIntoFile, rootDir } from '../tool-utils'; import { pressCarouselItems } from './utils/pressCarousel'; import { getMarkdownIt, loadMustachePartials, markdownToPageHtml, renderMustache } from './utils/render'; -import { Env, PlanPageParams, Sponsors, TemplateParams } from './utils/types'; +import { Env, OrgSponsor, PlanPageParams, Sponsors, TemplateParams } from './utils/types'; import { getPlans, StripePublicConfig } from '@joplin/lib/utils/joplinCloud'; +import { shuffle } from '@joplin/lib/array'; const dirname = require('path').dirname; const glob = require('glob'); const path = require('path'); @@ -42,7 +43,6 @@ async function getDonateLinks() { } function replaceGitHubByWebsiteLinks(md: string) { - // let output = md.replace(/https:\/\/github.com\/laurent22\/joplin\/blob\/master\/readme\/(.*?)\/index\.md(#[^\s)]+|)/g, 'https://joplinapp.org/$1'); return md .replace(/https:\/\/github.com\/laurent22\/joplin\/blob\/dev\/readme\/(.*?)\.md(#[^\s)]+|)/g, '/$1/$2') .replace(/https:\/\/github.com\/laurent22\/joplin\/blob\/dev\/README\.md(#[^\s)]+|)/g, '/help/$1'); @@ -182,7 +182,13 @@ async function updateDownloadPage(downloadButtonsHtml: Record) { async function loadSponsors(): Promise { const sponsorsPath = `${rootDir}/packages/tools/sponsors.json`; - return JSON.parse(await fs.readFile(sponsorsPath, 'utf8')); + const output: Sponsors = JSON.parse(await fs.readFile(sponsorsPath, 'utf8')); + output.orgs = shuffle(output.orgs.map(o => { + if (o.urlWebsite) o.url = o.urlWebsite; + return o; + })); + + return output; } async function main() { diff --git a/packages/tools/website/utils/types.ts b/packages/tools/website/utils/types.ts index 732717d0d7..420516f4e9 100644 --- a/packages/tools/website/utils/types.ts +++ b/packages/tools/website/utils/types.ts @@ -5,13 +5,14 @@ export enum Env { Prod = 'prod', } -interface GithubSponsor { +export interface GithubSponsor { name: string; id: string; } -interface OrgSponsor { +export interface OrgSponsor { url: string; + urlWebsite?: string; title: string; imageName: string; }