refactor: config in sub repo

This commit is contained in:
2026-04-26 14:47:14 +02:00
parent 3459d1e0b5
commit af9b20485e
7 changed files with 34 additions and 41 deletions
-5
View File
@@ -1,5 +0,0 @@
VITE_BASE_URL=http://localhost:8080/
VITE_APP_TITLE=<i icon=rss></i> My Blog
VITE_APP_SIGNATURE=By <b>me</b>
VITE_APP_LANG=en
VITE_CUSTOM_HEAD=
-6
View File
@@ -18,12 +18,6 @@ jobs:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- run: git clone ${{ vars.ARTICLES_REPOSITORY }} articles - run: git clone ${{ vars.ARTICLES_REPOSITORY }} articles
- run: bun run build - run: bun run build
env:
VITE_BASE_URL: ${{ vars.VITE_BASE_URL }}
VITE_APP_TITLE: ${{ vars.VITE_APP_TITLE }}
VITE_APP_SIGNATURE: ${{ vars.VITE_APP_SIGNATURE }}
VITE_APP_LANG: ${{ vars.VITE_APP_LANG }}
VITE_CUSTOM_HEAD: ${{ vars.VITE_CUSTOM_HEAD }}
- uses: actions/upload-artifact@v7 - uses: actions/upload-artifact@v7
with: with:
name: production-files name: production-files
+5 -5
View File
@@ -4,8 +4,6 @@
```bash ```bash
git clone $REPOSITORY articles git clone $REPOSITORY articles
cp .env.example .env
$EDITOR .env
bun run build bun run build
``` ```
@@ -20,6 +18,8 @@ bun run build
- [x] set page title - [x] set page title
- [x] SPA and opengraph - [x] SPA and opengraph
- [x] build with github actions - [x] build with github actions
- [ ] proper docs - [x] config in sub repo
- [ ] custom layout in sub repo ? - [ ] nav bar on top
- [ ] link to previous/next article - [ ] archive page
- [ ] link to previous/next article
- [ ] proper docs
+1 -1
View File
@@ -8,7 +8,7 @@
<link rel="stylesheet" type="text/css" href="/src/style.scss" /> <link rel="stylesheet" type="text/css" href="/src/style.scss" />
<meta property="og:url" content="%VITE_BASE_URL%" /> <meta property="og:url" content="%VITE_BASE_URL%" />
<meta property="og:title" content="%VITE_APP_TITLE_NO_HTML%" /> <meta property="og:title" content="%VITE_APP_TITLE_NO_HTML%" />
<link rel="alternate" href="%VITE_BASE_URL%/rss" type="application/rss+xml" title="RSS 2.0" /> <link rel="alternate" href="%VITE_BASE_URL%/rss.xml" type="application/rss+xml" title="RSS 2.0" />
<link rel="alternate" href="%VITE_BASE_URL%/atom.xml" type="application/atom+xml" title="Atom 2.0" /> <link rel="alternate" href="%VITE_BASE_URL%/atom.xml" type="application/atom+xml" title="Atom 2.0" />
<link rel="alternate" href="%VITE_BASE_URL%/feed.json" type="application/json" title="JSON Feed 1.0"/> <link rel="alternate" href="%VITE_BASE_URL%/feed.json" type="application/json" title="JSON Feed 1.0"/>
%VITE_CUSTOM_HEAD% %VITE_CUSTOM_HEAD%
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "md-blog", "name": "md-blog",
"version": "1.0.0", "version": "1.1.0",
"private": true, "private": true,
"type": "module", "type": "module",
"repository": "https://github.com/klemek/md-blog", "repository": "https://github.com/klemek/md-blog",
@@ -50,4 +50,4 @@
"engines": { "engines": {
"node": "^20.19.0 || >=22.12.0" "node": "^20.19.0 || >=22.12.0"
} }
} }
+18 -18
View File
@@ -1,10 +1,7 @@
import fs from 'fs' import fs from 'fs'
import process from 'process' import process from 'process'
import { Feed } from 'feed' import { Feed } from 'feed'
import articlesConfig from './articles/config.json'
try {
process.loadEnvFile()
} catch {}
function getFiles(dir: string): string[] { function getFiles(dir: string): string[] {
return fs.readdirSync(dir).flatMap((name) => { return fs.readdirSync(dir).flatMap((name) => {
@@ -49,9 +46,9 @@ function formatArticlePage(metadata: Record<string, string>, baseHtml: string):
outHtml = outHtml.replace(/<.*?property="og:url".*?>/gm, '') outHtml = outHtml.replace(/<.*?property="og:url".*?>/gm, '')
outHtml = outHtml.replace( outHtml = outHtml.replace(
/<\/head>/gm, /<\/head>/gm,
`<meta property="og:url" content="${process.env.VITE_BASE_URL}${metadata.path}/">\n</head>`, `<meta property="og:url" content="${articlesConfig['base_url']}${metadata.path}/">\n</head>`,
) )
const blog_title = process.env.VITE_APP_TITLE?.replace(/(<([^>]+)>)/gi, '').trim() const blog_title = articlesConfig['title']?.replace(/(<([^>]+)>)/gi, '').trim()
if (metadata.title) { if (metadata.title) {
const title = metadata.title.replace(/(<([^>]+)>)/gi, '').trim() const title = metadata.title.replace(/(<([^>]+)>)/gi, '').trim()
outHtml = outHtml.replace(/<title>.*?<\/title>/gm, `<title>${blog_title}${title}</title>`) outHtml = outHtml.replace(/<title>.*?<\/title>/gm, `<title>${blog_title}${title}</title>`)
@@ -70,7 +67,7 @@ function formatArticlePage(metadata: Record<string, string>, baseHtml: string):
outHtml = outHtml.replace(/<.*?property="og:image".*?>/gm, '') outHtml = outHtml.replace(/<.*?property="og:image".*?>/gm, '')
outHtml = outHtml.replace( outHtml = outHtml.replace(
/<\/head>/gm, /<\/head>/gm,
`<meta property="og:image" content="${metadata.thumbnail.replace('./', process.env.VITE_BASE_URL + metadata.path + '/')}">\n</head>`, `<meta property="og:image" content="${metadata.thumbnail.replace('./', articlesConfig['base_url'] + metadata.path + '/')}">\n</head>`,
) )
} }
return outHtml return outHtml
@@ -81,9 +78,9 @@ function addFeedArticle(metadata: Record<string, string>, feed: Feed) {
feed.addItem({ feed.addItem({
title: metadata.title.replace(/(<([^>]+)>)/gi, '').trim(), title: metadata.title.replace(/(<([^>]+)>)/gi, '').trim(),
id: metadata.path, id: metadata.path,
link: `${process.env.VITE_BASE_URL}${metadata.path}/`, link: `${articlesConfig['base_url']}${metadata.path}/`,
date: new Date(Date.parse(metadata.date)), date: new Date(Date.parse(metadata.date)),
image: metadata.thumbnail.replace('./', process.env.VITE_BASE_URL + metadata.path + '/'), image: metadata.thumbnail.replace('./', articlesConfig['base_url'] + metadata.path + '/'),
}) })
} }
} }
@@ -101,16 +98,16 @@ const metadatas = getFiles('articles')
.filter((metadata) => !!metadata) .filter((metadata) => !!metadata)
const feed = new Feed({ const feed = new Feed({
title: process.env.VITE_APP_TITLE?.replace(/(<([^>]+)>)/gi, '').trim() ?? '', title: articlesConfig['title']?.replace(/(<([^>]+)>)/gi, '').trim() ?? '',
id: process.env.VITE_BASE_URL, id: articlesConfig['base_url'],
link: process.env.VITE_BASE_URL, link: articlesConfig['base_url'],
language: process.env.VITE_APP_LANG, language: articlesConfig['lang'],
favicon: process.env.VITE_BASE_URL + '/articles/favicon.ico', favicon: articlesConfig['base_url'] + 'articles/favicon.ico',
generator: 'md-blog', generator: 'md-blog',
feedLinks: { feedLinks: {
json: process.env.VITE_BASE_URL + 'feed.json', json: articlesConfig['base_url'] + 'feed.json',
atom: process.env.VITE_BASE_URL + 'atom.xml', atom: articlesConfig['base_url'] + 'atom.xml',
rss: process.env.VITE_BASE_URL + 'rss', rss: articlesConfig['base_url'] + 'rss',
}, },
updated: new Date( updated: new Date(
Math.max( Math.max(
@@ -129,5 +126,8 @@ metadatas.forEach((metadata) => {
}) })
fs.writeFileSync('dist/feed.json', feed.json1()) fs.writeFileSync('dist/feed.json', feed.json1())
console.info(`Wrote dist/feed.json`)
fs.writeFileSync('dist/atom.xml', feed.atom1()) fs.writeFileSync('dist/atom.xml', feed.atom1())
fs.writeFileSync('dist/rss', feed.rss2()) console.info(`Wrote dist/atom.xml`)
fs.writeFileSync('dist/rss.xml', feed.rss2())
console.info(`Wrote dist/rss.xml`)
+8 -4
View File
@@ -4,14 +4,18 @@ import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools' import vueDevTools from 'vite-plugin-vue-devtools'
import { plugin as mdPlugin, Mode } from 'vite-plugin-markdown' import { plugin as mdPlugin, Mode } from 'vite-plugin-markdown'
import articlesConfig from './articles/config.json'
// https://vite.dev/config/ // https://vite.dev/config/
export default ({ mode }: { mode: string }) => { export default ({ mode }: { mode: string }) => {
process.env = { ...process.env, ...loadEnv(mode, process.cwd()) } process.env = { ...process.env, ...loadEnv(mode, process.cwd()) }
process.env.VITE_APP_TITLE_NO_HTML = process.env.VITE_APP_TITLE?.replace( process.env.VITE_BASE_URL = articlesConfig['base_url']
/(<([^>]+)>)/gi, process.env.VITE_APP_TITLE = articlesConfig['title']
'', process.env.VITE_APP_TITLE_NO_HTML = articlesConfig['title'].replace(/(<([^>]+)>)/gi, '').trim()
).trim() process.env.VITE_APP_LANG = articlesConfig['lang']
process.env.VITE_APP_SIGNATURE = articlesConfig['signature']
process.env.VITE_CUSTOM_HEAD = articlesConfig['custom_head']
return defineConfig({ return defineConfig({
plugins: [vue(), vueDevTools(), mdPlugin({ mode: [Mode.HTML] })], plugins: [vue(), vueDevTools(), mdPlugin({ mode: [Mode.HTML] })],