Skip to content

Commit 17be9d1

Browse files
author
luguellis
committed
feat: script for generating llm files
1 parent 667aaea commit 17be9d1

File tree

4 files changed

+123
-3
lines changed

4 files changed

+123
-3
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,5 @@ lib/
2727

2828
src/**/*.mjs
2929
scripts/**/*.mjs
30+
public/llms/manual/**/*.txt
31+
public/llms/react/**/*.txt

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,11 @@
5858
},
5959
"scripts": {
6060
"dev": "next",
61-
"build": "rescript && npm run update-index && next build",
61+
"build": "rescript && npm run generate-llms && npm run update-index && next build",
6262
"test": "node scripts/test-examples.mjs && node scripts/test-hrefs.mjs",
6363
"reanalyze": "reanalyze -all-cmt .",
64-
"update-index": "node scripts/extract-indices.mjs && node scripts/extract-tocs.mjs && node scripts/extract-syntax.mjs && node scripts/generate_feed.mjs > public/blog/feed.xml"
64+
"update-index": "node scripts/extract-indices.mjs && node scripts/extract-tocs.mjs && node scripts/extract-syntax.mjs && node scripts/generate_feed.mjs > public/blog/feed.xml",
65+
"generate-llms": "node scripts/generate_llms.mjs"
6566
},
6667
"devDependencies": {
6768
"@mdx-js/react": "^2.3.0",

scripts/generate_llms.res

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
let readMarkdownFile = (filePath: string): string => {
2+
let fileContent = Node.Fs.readFileSync2(filePath, "utf8")
3+
fileContent
4+
}
5+
6+
let rec collectFiles = (dirPath: string): array<string> => {
7+
let entries = Node.Fs.readdirSync(dirPath)
8+
entries->Array.reduce([], (acc, entry) => {
9+
let fullPath = Node.Path.join([dirPath, entry])
10+
let stats = Node.Fs.statSync(fullPath)
11+
switch stats["isDirectory"]() {
12+
| true => acc->Array.concat(collectFiles(fullPath))
13+
| false => {
14+
acc->Array.push(fullPath)
15+
acc
16+
}
17+
}
18+
})
19+
}
20+
21+
let clearFile = (filePath: string): unit => {
22+
Node.Fs.writeFileSync(filePath, "")
23+
}
24+
25+
let createDirectoryIfNotExists = (dirPath: string): unit => {
26+
if !Node.Fs.existsSync(dirPath) {
27+
Node.Fs.mkdirSync(dirPath)
28+
}
29+
}
30+
31+
let removeCodeTabTags = (content: string): string => {
32+
let regex = Js.Re.fromStringWithFlags("<CodeTab.*?>[\\s\\S]*?</CodeTab>", ~flags="g")
33+
Js.String.replaceByRe(regex, "", content)
34+
}
35+
36+
let removeCodeBlocks = (content: string): string => {
37+
let regex = Js.Re.fromStringWithFlags("```[a-zA-Z]+\\s*[\\s\\S]*?```", ~flags="g")
38+
Js.String.replaceByRe(regex, "", content)
39+
}
40+
41+
let removeFileTitle = (content: string): string => {
42+
let regex = Js.Re.fromStringWithFlags("---\ntitle[\\s\\S]*?---", ~flags="g")
43+
Js.String.replaceByRe(regex, "", content)
44+
}
45+
46+
let removeUnnecessaryBreaks = (content: string): string => {
47+
let regex = Js.Re.fromStringWithFlags("^\n{2,}", ~flags="g")
48+
Js.String.replaceByRe(regex, "", content)
49+
}
50+
51+
let removeToDos = (content: string): string => {
52+
let regex = Js.Re.fromStringWithFlags("<!-- TODO[\\s\\S]*?-->", ~flags="g")
53+
Js.String.replaceByRe(regex, "", content)
54+
}
55+
56+
let createFullFile = (content: string, filePath: string): unit => {
57+
Node.Fs.appendFileSync(filePath, content ++ "\n", "utf8")
58+
}
59+
60+
let createSmallFile = (content: string, filePath: string): unit => {
61+
let smallContent =
62+
content
63+
->removeCodeTabTags
64+
->removeFileTitle
65+
->removeToDos
66+
->removeCodeBlocks
67+
->removeUnnecessaryBreaks
68+
Node.Fs.appendFileSync(filePath, smallContent, "utf8")
69+
}
70+
71+
let processVersions = (
72+
versions: array<string>,
73+
docsDirectory: string,
74+
llmsDirectory: string,
75+
): unit => {
76+
let fullFileName = "llm-full.txt"
77+
let smallFileName = "llm-small.txt"
78+
let llmsFileName = "llms.txt"
79+
80+
versions->Array.forEach(version => {
81+
let versionDir = docsDirectory->Node.Path.join2(version)
82+
let llmsDir = llmsDirectory->Node.Path.join2(version)
83+
let fullFilePath = llmsDir->Node.Path.join2(fullFileName)
84+
let smallFilePath = llmsDir->Node.Path.join2(smallFileName)
85+
86+
createDirectoryIfNotExists(llmsDir)
87+
clearFile(fullFilePath)
88+
clearFile(smallFilePath)
89+
90+
versionDir
91+
->collectFiles
92+
->Array.forEach(filePath => {
93+
if Js.String.endsWith(".mdx", filePath) {
94+
let content = readMarkdownFile(filePath)
95+
96+
content->createFullFile(fullFilePath)
97+
98+
content->createSmallFile(smallFilePath)
99+
}
100+
})
101+
})
102+
}
103+
104+
let manualVersions = ["v12.0.0", "v11.0.0"]
105+
let reactManualVersions = ["latest", "v0.10.0", "v0.11.0"]
106+
107+
let manualDocsDirectory = "pages/docs/manual"
108+
let reactDocsDirectory = "pages/docs/react"
109+
110+
let manualLlmsDirectory = "public/llms/manual"
111+
let reactLlmsDirectory = "public/llms/react"
112+
113+
processVersions(manualVersions, manualDocsDirectory, manualLlmsDirectory)
114+
processVersions(reactManualVersions, reactDocsDirectory, reactLlmsDirectory)

src/bindings/Node.res

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ module Process = {
2020

2121
module Fs = {
2222
@module("fs") external readFileSync: string => string = "readFileSync"
23+
@module("fs") external readFileSync2: (string, string) => string = "readFileSync"
2324
@module("fs") external readdirSync: string => array<string> = "readdirSync"
2425
@module("fs") external writeFileSync: (string, string) => unit = "writeFileSync"
26+
@module("fs") external appendFileSync: (string, string, string) => unit = "appendFileSync"
2527
@module("fs") external existsSync: string => bool = "existsSync"
2628
@module("fs") external mkdirSync: string => unit = "mkdirSync"
29+
@module("fs") external statSync: string => {.."isDirectory": unit => bool} = "statSync"
2730
}
2831

2932
module Buffer = {
@@ -34,4 +37,4 @@ module Buffer = {
3437
module ChildProcess = {
3538
@module("child_process")
3639
external execSync: string => Buffer.t = "execSync"
37-
}
40+
}

0 commit comments

Comments
 (0)