tldraw/apps/docs/utils/autoLinkDocs.ts

59 lines
1.8 KiB
TypeScript
Raw Normal View History

/* eslint-disable no-useless-escape */
import { Article } from '@/types/content-types'
import { Database } from 'sqlite'
import sqlite3 from 'sqlite3'
export async function autoLinkDocs(db: Database<sqlite3.Database, sqlite3.Statement>) {
// replace [TLEditor](?) with [TLEditor](/reference/editor/TLEditor)?
// not sure how we would get there but finding an article with the same title
docs: rework docs site to have different sections (#2686) This PR starts putting in place the high-level changes we want to make to the docs site. - It makes separate sections for Reference and Examples and Community. - Gets rid of the secondary sidebar and integrates it into the main sidebar. - Groups the reference articles by type. - Pulls in the examples alongside code and a live playground so people don't have to visit examples.tldraw.com separately. <img width="1458" alt="Screenshot 2024-01-30 at 09 43 46" src="https://github.com/tldraw/tldraw/assets/469604/4f5aa339-3a69-4d9b-9b9f-dfdddea623e8"> Again, this is the top-level changes and there's more to be done for the next PR(s): - create quick start page - clean up installation page - add accordion to Examples page prbly - put fun stuff in header (from footer) - landing page - something for landing page of API - search cmd-k and border - cleanup _sidebarReferenceContentLinks - external links _blank - address potential skew issue with code examples - have a link to other examples (next.js, etc.) ### Change Type - [x] `documentation` — Changes to the documentation only[^2] ### Test Plan 1. Make sure examples work! ### Release Notes - Rework our docs site to pull together the examples app and reference section more cohesively. --------- Co-authored-by: Taha <98838967+Taha-Hassan-Git@users.noreply.github.com> Co-authored-by: Steve Ruiz <steveruizok@gmail.com> Co-authored-by: Mitja Bezenšek <mitja.bezensek@gmail.com> Co-authored-by: alex <alex@dytry.ch> Co-authored-by: Lu Wilson <l2wilson94@gmail.com> Co-authored-by: Dan Groshev <git@dgroshev.com>
2024-01-30 14:19:25 +00:00
const articles = await db.all(
'SELECT id, content FROM articles WHERE sectionId != ?',
'reference'
)
await Promise.all(articles.map((a) => autoLinkDocsForArticle(db, a)))
}
const regex = /\[([^\[\]]*?)\]\(\?\)/g
export async function autoLinkDocsForArticle(
db: Database<sqlite3.Database, sqlite3.Statement>,
{ id, content }: Pick<Article, 'id' | 'content'>
) {
if (!content) return
let didChange = false
let result = content
const matches = content.matchAll(regex)
if (!matches) return
for (const match of Array.from(matches)) {
const [hit, _title] = match
const [title, heading] = _title.split('#')
const article = await db.get(
'SELECT id, sectionId, categoryId FROM articles WHERE title = ? AND sectionId = ?',
title,
docs: rework docs site to have different sections (#2686) This PR starts putting in place the high-level changes we want to make to the docs site. - It makes separate sections for Reference and Examples and Community. - Gets rid of the secondary sidebar and integrates it into the main sidebar. - Groups the reference articles by type. - Pulls in the examples alongside code and a live playground so people don't have to visit examples.tldraw.com separately. <img width="1458" alt="Screenshot 2024-01-30 at 09 43 46" src="https://github.com/tldraw/tldraw/assets/469604/4f5aa339-3a69-4d9b-9b9f-dfdddea623e8"> Again, this is the top-level changes and there's more to be done for the next PR(s): - create quick start page - clean up installation page - add accordion to Examples page prbly - put fun stuff in header (from footer) - landing page - something for landing page of API - search cmd-k and border - cleanup _sidebarReferenceContentLinks - external links _blank - address potential skew issue with code examples - have a link to other examples (next.js, etc.) ### Change Type - [x] `documentation` — Changes to the documentation only[^2] ### Test Plan 1. Make sure examples work! ### Release Notes - Rework our docs site to pull together the examples app and reference section more cohesively. --------- Co-authored-by: Taha <98838967+Taha-Hassan-Git@users.noreply.github.com> Co-authored-by: Steve Ruiz <steveruizok@gmail.com> Co-authored-by: Mitja Bezenšek <mitja.bezensek@gmail.com> Co-authored-by: alex <alex@dytry.ch> Co-authored-by: Lu Wilson <l2wilson94@gmail.com> Co-authored-by: Dan Groshev <git@dgroshev.com>
2024-01-30 14:19:25 +00:00
'reference'
)
if (!article) throw Error(`Could not find article for ${_title} (${title})`)
let str = ''
if (heading) {
const headingRow = await db.get('SELECT slug FROM headings WHERE slug = ?', heading)
if (!headingRow) throw Error(`Could not find heading for ${_title} (${heading})`)
str = `[\`${title}.${heading}\`](/${article.sectionId}/${article.categoryId}/${article.id}#${headingRow.slug})`
} else {
str = `[\`${title}\`](/${article.sectionId}/${article.categoryId}/${article.id})`
}
result = result.replaceAll(hit, str)
didChange = true
}
if (didChange) {
await db.run('UPDATE articles SET content = ? WHERE id = ?', result, id)
}
}