From 1a26f0aaf40fe8b67f589c08b20bd4d667f2a5d7 Mon Sep 17 00:00:00 2001 From: moris Date: Sun, 19 Jan 2025 01:06:28 +0900 Subject: [PATCH] add source codes --- .env.example | 6 + .npmrc | 1 + .vscode/settings.json | 3 + Caddyfile | 7 + bun.lockb | Bin 0 -> 91926 bytes package-lock.json | 735 ++++++++++++++++++ package.json | 39 + src/app.css | 99 +++ src/app.d.ts | 13 + src/app.html | 12 + src/lib/components/Markdown.css | 193 +++++ src/lib/components/Markdown.ts | 30 + src/lib/components/rainbow.css | 120 +++ src/lib/server/LoadPost.ts | 26 + src/lib/server/MetaParser.ts | 34 + src/lib/server/Metadatas.ts | 68 ++ src/lib/server/PostList.ts | 15 + src/routes/(DefaultStyle)/+layout.svelte | 121 +++ src/routes/(DefaultStyle)/+page.svelte | 11 + .../(DefaultStyle)/[slug]/+page.server.ts | 11 + src/routes/(DefaultStyle)/[slug]/+page.svelte | 74 ++ src/routes/(DefaultStyle)/[slug]/grid.svelte | 117 +++ .../(DefaultStyle)/about/+page.server.ts | 10 + src/routes/(DefaultStyle)/about/+page.svelte | 26 + src/routes/(DefaultStyle)/about/profile.md | 9 + .../(DefaultStyle)/category/+page.server.ts | 17 + .../(DefaultStyle)/category/+page.svelte | 9 + .../category/[slug]/+page.server.ts | 11 + .../category/[slug]/+page.svelte | 8 + src/routes/(DefaultStyle)/footer.svelte | 77 ++ src/routes/(DefaultStyle)/header.svelte | 27 + .../(DefaultStyle)/post/+page.server.ts | 9 + src/routes/(DefaultStyle)/post/+page.svelte | 15 + .../post/[slug]/+page.server.ts | 28 + .../(DefaultStyle)/post/[slug]/+page.svelte | 311 ++++++++ .../(DefaultStyle)/post/[slug]/profile.svelte | 49 ++ .../post/[slug]/raw.md/+server.ts | 9 + .../(DefaultStyle)/post/[slug]/share.svelte | 92 +++ .../(DefaultStyle)/post/[slug]/toc.svelte | 46 ++ src/routes/(DefaultStyle)/tag/+page.server.ts | 17 + src/routes/(DefaultStyle)/tag/+page.svelte | 9 + .../(DefaultStyle)/tag/[slug]/+page.server.ts | 11 + .../(DefaultStyle)/tag/[slug]/+page.svelte | 8 + src/routes/+layout.ts | 2 + src/routes/code/+layout.ts | 1 + src/routes/code/+page.server.ts | 12 + src/routes/code/+page.svelte | 10 + src/routes/code/[slug]/+layout.svelte | 75 ++ src/routes/code/[slug]/+page.server.ts | 10 + src/routes/code/[slug]/+page.svelte | 5 + src/routes/code/[slug]/app.css | 35 + src/routes/feed.rss/+server.ts | 46 ++ svelte.config.js | 17 + tsconfig.json | 19 + vite.config.ts | 9 + 55 files changed, 2774 insertions(+) create mode 100644 .env.example create mode 100644 .npmrc create mode 100644 .vscode/settings.json create mode 100644 Caddyfile create mode 100755 bun.lockb create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/lib/components/Markdown.css create mode 100644 src/lib/components/Markdown.ts create mode 100644 src/lib/components/rainbow.css create mode 100644 src/lib/server/LoadPost.ts create mode 100644 src/lib/server/MetaParser.ts create mode 100644 src/lib/server/Metadatas.ts create mode 100644 src/lib/server/PostList.ts create mode 100644 src/routes/(DefaultStyle)/+layout.svelte create mode 100644 src/routes/(DefaultStyle)/+page.svelte create mode 100644 src/routes/(DefaultStyle)/[slug]/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/[slug]/+page.svelte create mode 100644 src/routes/(DefaultStyle)/[slug]/grid.svelte create mode 100644 src/routes/(DefaultStyle)/about/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/about/+page.svelte create mode 100644 src/routes/(DefaultStyle)/about/profile.md create mode 100644 src/routes/(DefaultStyle)/category/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/category/+page.svelte create mode 100644 src/routes/(DefaultStyle)/category/[slug]/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/category/[slug]/+page.svelte create mode 100644 src/routes/(DefaultStyle)/footer.svelte create mode 100644 src/routes/(DefaultStyle)/header.svelte create mode 100644 src/routes/(DefaultStyle)/post/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/post/+page.svelte create mode 100644 src/routes/(DefaultStyle)/post/[slug]/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/post/[slug]/+page.svelte create mode 100644 src/routes/(DefaultStyle)/post/[slug]/profile.svelte create mode 100644 src/routes/(DefaultStyle)/post/[slug]/raw.md/+server.ts create mode 100644 src/routes/(DefaultStyle)/post/[slug]/share.svelte create mode 100644 src/routes/(DefaultStyle)/post/[slug]/toc.svelte create mode 100644 src/routes/(DefaultStyle)/tag/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/tag/+page.svelte create mode 100644 src/routes/(DefaultStyle)/tag/[slug]/+page.server.ts create mode 100644 src/routes/(DefaultStyle)/tag/[slug]/+page.svelte create mode 100644 src/routes/+layout.ts create mode 100644 src/routes/code/+layout.ts create mode 100644 src/routes/code/+page.server.ts create mode 100644 src/routes/code/+page.svelte create mode 100644 src/routes/code/[slug]/+layout.svelte create mode 100644 src/routes/code/[slug]/+page.server.ts create mode 100644 src/routes/code/[slug]/+page.svelte create mode 100644 src/routes/code/[slug]/app.css create mode 100644 src/routes/feed.rss/+server.ts create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..12fc788 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# Hostname +PUBLIC_HOSTNAME = 'moris.day' + +# Post +POST_DIR = '/home/user/BlogPosts' +PUBLIC_POST_REPO = 'https://github.com/moris/Posts' \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4b69478 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "npm.packageManager": "bun", +} \ No newline at end of file diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..33e1efc --- /dev/null +++ b/Caddyfile @@ -0,0 +1,7 @@ +localhost:80, macbookair.local:80 { + file_server + + handle_path /blog/* { + root build + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..b44a5fc70596ea75ceced93cf5f0b0cf65c0f6ae GIT binary patch literal 91926 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 z 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 Fe*id}bTI$` literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d7375b6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,735 @@ +{ + "name": "day.moris.blog", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "day.moris.blog", + "version": "0.0.1", + "devDependencies": { + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^5.4.11" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.29.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "import-meta-resolve": "^4.1.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.8.tgz", + "integrity": "sha512-YaDrquRpZwfcXbnlDsSrBQNCChVOT9MGuSg+dMAyfsAa1SmiAhrA5jUYUiIMC59G92kIbY/AaQOWcBdq+lh+zg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.15.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0", + "devalue": "^5.1.0", + "esm-env": "^1.2.1", + "import-meta-resolve": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0", + "tiny-glob": "^0.2.9" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", + "debug": "^4.3.7", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.12", + "vitefu": "^1.0.3" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0-next.96 || ^5.0.0", + "vite": "^5.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", + "svelte": "^5.0.0-next.96 || ^5.0.0", + "vite": "^5.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.14.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/esm-env": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.4.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/globrex": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.49", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.16.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^1.3.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.7.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "5.4.11", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..67e2b3a --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "day.moris.blog", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.8", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^5.4.11", + "@types/bun": "latest" + }, + "dependencies": { + "@twemoji/parser": "^15.1.1", + "github-slugger": "^2.0.0", + "rehype-external-links": "^3.0.0", + "rehype-highlight": "^7.0.1", + "rehype-katex": "^7.0.1", + "rehype-slug": "^6.0.0", + "rehype-stringify": "^10.0.1", + "remark": "^15.0.1", + "remark-breaks": "^4.0.0", + "remark-gfm": "^4.0.0", + "remark-math": "^6.0.0", + "remark-rehype": "^11.1.1", + "yaml": "^2.6.1" + }, + "module": "index.ts" +} \ No newline at end of file diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..ff5e16f --- /dev/null +++ b/src/app.css @@ -0,0 +1,99 @@ +@property --theme-color { + syntax: ""; + inherits: true; +} +@property --back-color { + syntax: ""; + inherits: true; +} +@property --grid-color { + syntax: ""; + inherits: true; +} + +/* theme color */ +body, body.light { + --color-scheme: light; + --white-black: white; + --black-white: black; + --theme-color: hsl(85, 50%, 60%); + --back-color: hsl(60, 100%, 98%); + --font-color: #222; + --grid-color: #fff; + --code-color: #ddd; + --code-block: #30303a; + --frame-shadow: #999; +} + +body.dark { + --color-scheme: dark; + --white-black: black; + --black-white: white; + --theme-color: teal; + --back-color: hsl(210, 7%, 18%); + --font-color: #f5f5f5; + --grid-color: #333; + --code-color: #445; + --code-block: #23232a; + --frame-shadow: #111; +} + +@media(prefers-color-scheme: dark){ + body { + --color-scheme: dark; + --white-black: black; + --black-white: white; + --theme-color: teal; + --back-color: hsl(210, 7%, 18%); + --font-color: #fafafa; + --grid-color: #333; + --code-color: #445; + --code-block: #23232a; + --frame-shadow: #111; + } +} + +/* general */ +body { + margin: 0; + color: var(--font-color); +} + +img { + -webkit-user-drag: none; + user-select: none; +} + +@media (scripting: none) { + .js {display: none !important;} +} + + + +/* font */ +body { + font-family: "-apple-system", "BlinkMacSystemFont", "Hiragino Kaku Gothic ProN", "Noto Sans CJK JP", "Segoe UI", "BIZ UDPGothic", sans-serif; + /* Apple | Linux | win-en win-jp */ +} +code { + font-family: "Source Code Pro", "Monaco", "Consolas", "BIZ UDGothic", monospace; + /* Linux | Apple | windows | 和文 */ +} +em { + font-family: serif; +} + + + +/* link style */ +a { + text-decoration: none; + color: var(--theme-color); + + &:hover { + text-decoration: underline; + } + &:visited { + color: hsl(290, 40%, 50%); + } +} \ No newline at end of file diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..da08e6d --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..94b5e5b --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/components/Markdown.css b/src/lib/components/Markdown.css new file mode 100644 index 0000000..edc0bda --- /dev/null +++ b/src/lib/components/Markdown.css @@ -0,0 +1,193 @@ +.markdown { + width: 100%; + overflow-wrap: anywhere; + + @media (width>480px) { + font-size: 1.125em; + } + + & h1, h2 { + font-weight: 600; + padding-top: 25px; + @media(width>999px){padding-top:50px; margin-top:0;} + + &::before { + display: inline-block; + content: '§'; + margin-right: 4px; + width: 4px; + color: #0000; + background-color: var(--theme-color); + } + } + + & p { + margin: 0 0.5em; + line-height: 2em; + @media (width>480px) { + margin: 1em 2em; + } + } + + & a[target="_blank"]:after { + content: '■'; + font-size: 1em; + line-height: 1em; + width: 1em; + height: 1em; + display: inline-block; + mask-image: url('data:image/svg+xml;utf-8,'); + vertical-align: top; + } + + & li { + line-height: 1.5em; + } + + & img { + display: block; + margin: 1em auto; + max-width: 100%; + max-height: 60vh; + } + + & code { + font-size: 1rem; + margin: 0 3px; + padding: 0 3px; + border-radius: 3px; + background-color: var(--code-color); + } + & details { + margin: 0 0.5em; + padding: 0 .5em; + border: dashed #8888 2px; + border-radius: 6px; + line-height: 2em; + @media (width>480px) { + margin: 1em 2em; + } + } + & pre { + position: relative; + margin: 1em; + padding: 1em; + box-sizing: border-box; + border-radius: 8px; + background-color: var(--code-block); + color: #d1d9e1; + overflow: auto; + scrollbar-width: thin; + scrollbar-color: #aaa #444; + + @media (width<480px) { + margin: 1em 0; + } + & code { + margin: 0; + padding: 0; + border-radius: 0; + background-color: #fff0; + } + /* + issue: 擬似要素は { イベントリスナを設置できない, アニメーション不可, スクロールに巻き込まれる } + &::after { + content: ''; + background-image: url('data:image/svg+xml;utf-8,'); + width: 1.5em; + height: 1.5em; + position: absolute; + top: 1em; + right: 1em; + } */ + } + & table { + margin: 1rem auto; + font-size: 1.2rem; + border-collapse: collapse; + + & thead tr { + border-bottom: solid 1px var(--black-white); + } + & tbody tr { + border-top: solid color-mix(in srgb, var(--black-white) 20%, var(--back-color)) 1px; + /* background-color: color-mix(in srgb, var(--black-white) 10%, var(--back-color)); */ + } + & td,th { + border-width: 0px; + padding: .5em; + } + } + & blockquote { + position: relative; + font-style: italic; + width: fit-content; + max-width: 100%; + margin: 1em auto; + border-top: 1px solid var(--font-color); + border-bottom: 1px solid var(--font-color); + + & p::before { + content: ''; + mask-image: url('data:image/svg+xml;utf-8,'); + width: 1em; + height: 1em; + position: absolute; + background-color: var(--font-color); + top: -.4em; + left: -1em; + } + & p::after { + content: ''; + mask-image: url('data:image/svg+xml;utf-8,'); + width: 1em; + height: 1em; + position: absolute; + background-color: var(--font-color); + bottom: -.4em; + right: -1em; + } + } + & iframe { + display: block; + margin: 30px auto; + border: none; + width: 80%; + aspect-ratio: 16/9; + border-radius: 12px; + box-shadow: 0px 6px 30px var(--frame-shadow); + max-height: 75vh; + transition: max-height .3s ease-in-out; + &.hide { + max-height: 30px; + } + @media(width<480px) { + width: 100%; + aspect-ratio: 4/3; + box-shadow: 0px 4px 16px var(--frame-shadow); + } + @media(width>1280px) { + width: 60%; + } + &[src*="youtube.com"]{ + aspect-ratio: 16/9; + } + } + & video { + display: block; + margin: 30px auto; + width: 80%; + border-radius: 15px; + box-shadow: 0px 6px 30px var(--frame-shadow); + @media(width<480px) { + width: 100%; + } + @media(width>1280px) { + width: 60%; + } + } + & math[display="block"] { + margin: 1rem; + font-size: 1.5rem; + } +} \ No newline at end of file diff --git a/src/lib/components/Markdown.ts b/src/lib/components/Markdown.ts new file mode 100644 index 0000000..a67c526 --- /dev/null +++ b/src/lib/components/Markdown.ts @@ -0,0 +1,30 @@ +export default Perser; + +import { remark } from 'remark' +import remarkgfm from 'remark-gfm' +import remarkBreaks from "remark-breaks" +import remarkmath from 'remark-math' +import remarkRehype from 'remark-rehype' +import rehypeslug from 'rehype-slug' +import rehypeKatex from 'rehype-katex' +import rehypeHighlight from 'rehype-highlight' +import rehypeExternalLinks from 'rehype-external-links' +import rehypeStringify from 'rehype-stringify' + + +function Perser(mdtext: string): string { + let md = remark() + .use(remarkgfm) // Github Markdown + .use(remarkBreaks) // 改行 + .use(remarkmath) // 数式 + .use(remarkRehype, {allowDangerousHtml: true}) + .use(rehypeslug) // headingにidを設定 + .use(rehypeKatex, {output:'mathml'}) // 数式 + .use(rehypeHighlight) // Syntax highlight + .use(rehypeExternalLinks, {target:'_blank', rel:['noreferrer','noopener']}) // 外部サイトを新規タブで開く + .use(rehypeStringify, {allowDangerousHtml: true}) + .processSync(mdtext) + .toString() + + return md +} \ No newline at end of file diff --git a/src/lib/components/rainbow.css b/src/lib/components/rainbow.css new file mode 100644 index 0000000..dc8452f --- /dev/null +++ b/src/lib/components/rainbow.css @@ -0,0 +1,120 @@ +/* + +BSD 3-Clause License + +Copyright (c) 2006, Ivan Sagalaev. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +/* + +Style with support for rainbow parens + +*/ + +.hljs { + background: #474949; + color: #d1d9e1; +} + + +.hljs-comment, +.hljs-quote { + color: #969896; + font-style: italic; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-type { + color: #cc99cc; +} + +.hljs-number, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #f99157; +} + +.hljs-string, +.hljs-doctag, +.hljs-regexp { + color: #8abeb7; +} + +.hljs-title, +.hljs-name, +.hljs-section, +.hljs-built_in { + color: #b5bd68; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-selector-id, +.hljs-title.class_, +.hljs-class .hljs-title { + color: #ffcc66; +} + +.hljs-section, +.hljs-strong { + font-weight: bold; +} + +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-link { + color: #f99157; +} + +.hljs-deletion { + color: #dc322f; +} + +.hljs-addition { + color: #68dc2e +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-attr, +.hljs-attribute { + color: #81a2be; +} + +.hljs-emphasis { + font-style: italic; +} diff --git a/src/lib/server/LoadPost.ts b/src/lib/server/LoadPost.ts new file mode 100644 index 0000000..7bd26d8 --- /dev/null +++ b/src/lib/server/LoadPost.ts @@ -0,0 +1,26 @@ +export default getpost; + +import { POST_DIR } from '$env/static/private'; +import Parser from './MetaParser'; +import fs from 'node:fs'; + + +async function getpost(id:string) { + const md = fs.readFileSync(`${POST_DIR}/Posts/${id}.md`, 'utf8'); + + let fm_line = md.split('\n'); + + let line_no:number[] = [] + fm_line.forEach((i,n)=>{ + if(i=='---'){line_no.push(n)} + }) + + let a = line_no[0] + + let md_text = fm_line.slice(line_no[1]+1).join('\n'); + let fm_text = fm_line.slice(line_no[0]+1, line_no[1]).join('\n'); + + let metadata = Parser(fm_text); + + return {metadata: metadata, post: md_text} +} \ No newline at end of file diff --git a/src/lib/server/MetaParser.ts b/src/lib/server/MetaParser.ts new file mode 100644 index 0000000..9b37a75 --- /dev/null +++ b/src/lib/server/MetaParser.ts @@ -0,0 +1,34 @@ +export default parser; + +import yaml from "yaml" +import { parse } from '@twemoji/parser'; +import { error } from '@sveltejs/kit'; + +function parser(fm_text:string) { + + let persed = yaml.parse(fm_text); + + let fms = (fm:unknown) => { + if (typeof fm === 'object' && fm !== null){ + let title = 'title' in fm && typeof fm.title === 'string' ? fm.title : '' + let description = 'description' in fm && typeof fm.description === 'string'? fm.description : '' + let thumbnail = 'thumbnail' in fm && typeof fm.thumbnail === 'string' ? fm.thumbnail : '' + let emoji = 'emoji' in fm && typeof fm.emoji === 'string' ? fm.emoji : '' + let date_str = 'date' in fm && typeof fm.date === 'string' ? fm.date : '' + let category = 'category' in fm && typeof fm.category === 'string' ? fm.category : 'other' + let tags = 'tags' in fm && Array.isArray(fm.tags) ? fm.tags : [] + let index = 'index' in fm && typeof fm.index === 'boolean' ? fm.index : true + let published = 'published' in fm && typeof fm.published === 'boolean' ? fm.published : false + + emoji = emoji? parse(emoji)[0].url:'' + + let date:Date = new Date(date_str) + + return {title, description,thumbnail,emoji,date,category,tags,index,published} + } else { + error(500,{message:'Invalid frontmatter'}) + } + } + + return fms(persed) +} \ No newline at end of file diff --git a/src/lib/server/Metadatas.ts b/src/lib/server/Metadatas.ts new file mode 100644 index 0000000..3280d5b --- /dev/null +++ b/src/lib/server/Metadatas.ts @@ -0,0 +1,68 @@ +export default Metadatas; + +import fs from 'node:fs'; +import path from 'node:path'; +import Posts from './PostList'; +import Load from './LoadPost'; + +import { dev } from '$app/environment'; + +async function Metadatas() { + + const cache_dir = '/tmp/day.moris.blog/'; + const cache_file = `${cache_dir}metadata.json`; + + async function build() { + const posts = await Posts(); + + const metadataList = await Promise.all(posts.map(async (file)=>{ + const postId = path.basename(file, '.md') + const metadata = (await Load(postId)).metadata + return {postId, metadata} + })) + + const sorted = metadataList + .sort((a,b)=>{ + return b.metadata.date.getTime() - a.metadata.date.getTime() + }) + .filter((m)=> dev||m.metadata.published) + + return sorted + } + + async function makeCache() { + let data = await build() + let cache_data = { + cached_time: Date.now(), + dev, + data + } + + if (!fs.existsSync(cache_dir)) { + fs.mkdirSync(cache_dir), {recursive: true} + } + + fs.writeFileSync(cache_file, JSON.stringify(cache_data, null, 2), 'utf8') + return data + } + + + if (fs.existsSync(cache_file)) { + const cache = JSON.parse(fs.readFileSync(cache_file, 'utf8'), (key,value)=>{ + if(key=='date'){ + return (new Date(value)); + } + return value + }) + + if (Boolean(cache.dev)!=dev || Date.now()-cache.cached_time>5*60000) { + const data = await makeCache() + return data + } else { + return cache.data + } + } else { + const data = await makeCache() + return data + } +} \ No newline at end of file diff --git a/src/lib/server/PostList.ts b/src/lib/server/PostList.ts new file mode 100644 index 0000000..c5eb622 --- /dev/null +++ b/src/lib/server/PostList.ts @@ -0,0 +1,15 @@ +export default postList; + +import fs from 'node:fs'; +import Path from 'node:path'; + +import { POST_DIR } from '$env/static/private'; + +async function postList() { + + const files = fs.readdirSync(`${POST_DIR}/Posts`); + + const posts = files.filter((content)=> Path.extname(content)=='.md' && content!='README.md') + + return posts +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/+layout.svelte b/src/routes/(DefaultStyle)/+layout.svelte new file mode 100644 index 0000000..f74b54c --- /dev/null +++ b/src/routes/(DefaultStyle)/+layout.svelte @@ -0,0 +1,121 @@ + + + + + + + +
+
+ {#if dev} +
DEV DUILD
+ {/if} + +
+
+
+
+
+ +
+
+ {@render children()} +
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/+page.svelte b/src/routes/(DefaultStyle)/+page.svelte new file mode 100644 index 0000000..3112aa7 --- /dev/null +++ b/src/routes/(DefaultStyle)/+page.svelte @@ -0,0 +1,11 @@ + + +To show posts, click here \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/[slug]/+page.server.ts b/src/routes/(DefaultStyle)/[slug]/+page.server.ts new file mode 100644 index 0000000..56b705b --- /dev/null +++ b/src/routes/(DefaultStyle)/[slug]/+page.server.ts @@ -0,0 +1,11 @@ +import Metas from '$lib/server/Metadatas'; + +export async function load({params}){ + const pageNo = Number(params.slug) + const postList = await Metas() + + const posts = postList.slice(pageNo*12, (pageNo+1)*12); + const lastPage = Math.ceil(postList.length/12)-1; + + return {posts, pageNo, lastPage} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/[slug]/+page.svelte b/src/routes/(DefaultStyle)/[slug]/+page.svelte new file mode 100644 index 0000000..4ce3cf6 --- /dev/null +++ b/src/routes/(DefaultStyle)/[slug]/+page.svelte @@ -0,0 +1,74 @@ + + + + 記事一覧 | moris.day Blog + + + + +
+
+ {#each data.posts as post} +
+ + + +
+ {/each} + {#if data.posts.length%4} + {#each Array(4-data.posts.length%4) as i} +
+ {/each} + {/if} +
+ +
+ + {data.pageNo}/{data.lastPage} + +
+
+ + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/[slug]/grid.svelte b/src/routes/(DefaultStyle)/[slug]/grid.svelte new file mode 100644 index 0000000..c82c992 --- /dev/null +++ b/src/routes/(DefaultStyle)/[slug]/grid.svelte @@ -0,0 +1,117 @@ + + +
+
+ {#if thumbnail } + thumbnail + {:else if emoji} + {#await twemoji(emoji)} +
+ {:then emojisvg} +
+ {@html emojisvg} +
+ {/await} + + {:else} + ')}' alt="fallback"/> + {/if} + +
{date.toLocaleDateString('sv-SE')}
+
{category}
+
+
+
{title}
+
{description}
+
+
+ + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/about/+page.server.ts b/src/routes/(DefaultStyle)/about/+page.server.ts new file mode 100644 index 0000000..f6eb26e --- /dev/null +++ b/src/routes/(DefaultStyle)/about/+page.server.ts @@ -0,0 +1,10 @@ +import fs from 'node:fs'; +import Perser from '$lib/components/Markdown' + +export async function load(){ + const profile_md = fs.readFileSync(`${process.cwd()}/src/routes/(DefaultStyle)/about/profile.md`, 'utf-8') + + let persed = Perser(profile_md) + + return {md: persed} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/about/+page.svelte b/src/routes/(DefaultStyle)/about/+page.svelte new file mode 100644 index 0000000..2423a85 --- /dev/null +++ b/src/routes/(DefaultStyle)/about/+page.svelte @@ -0,0 +1,26 @@ + + + + + About | moris.day Blog + + +
+
+ {@html data.md} +
+
+ + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/about/profile.md b/src/routes/(DefaultStyle)/about/profile.md new file mode 100644 index 0000000..0fd77bc --- /dev/null +++ b/src/routes/(DefaultStyle)/about/profile.md @@ -0,0 +1,9 @@ +## プロフィール +![morisのアイコン](https://moris.day/blog/icon_192.webp) +moris + + +## ライセンス +このブログのコンテンツは全てCC-BY-4.0の下で提供されます。 + +このブログのソースコードは[Gitea](https://git.moris.day/moris/moris-blog)で公開されており、MITライセンスの下で使用、改変、再頒布などを行うことができます。 \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/category/+page.server.ts b/src/routes/(DefaultStyle)/category/+page.server.ts new file mode 100644 index 0000000..4628088 --- /dev/null +++ b/src/routes/(DefaultStyle)/category/+page.server.ts @@ -0,0 +1,17 @@ +import Metadatas from "$lib/server/Metadatas"; + +export async function load() { + let metalist = await Metadatas() + + let cats: string[] = [] + + for (let meta of metalist){ + let cat = meta.metadata.category; + + if (!cats.includes(cat)) { + cats.push(cat) + } + } + + return {cats} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/category/+page.svelte b/src/routes/(DefaultStyle)/category/+page.svelte new file mode 100644 index 0000000..2aba39c --- /dev/null +++ b/src/routes/(DefaultStyle)/category/+page.svelte @@ -0,0 +1,9 @@ + + +{#each data.cats as cat} +
+ {cat} +
+{/each} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/category/[slug]/+page.server.ts b/src/routes/(DefaultStyle)/category/[slug]/+page.server.ts new file mode 100644 index 0000000..ea36a87 --- /dev/null +++ b/src/routes/(DefaultStyle)/category/[slug]/+page.server.ts @@ -0,0 +1,11 @@ +import Metadatas from "$lib/server/Metadatas"; + +export async function load({params}) { + const cat = params.slug + + const metalist = await Metadatas() + + const result = metalist.filter((meta)=>meta.metadata.category == cat).map((meta)=>meta.postId) + + return {posts: result} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/category/[slug]/+page.svelte b/src/routes/(DefaultStyle)/category/[slug]/+page.svelte new file mode 100644 index 0000000..7afe2e5 --- /dev/null +++ b/src/routes/(DefaultStyle)/category/[slug]/+page.svelte @@ -0,0 +1,8 @@ + + +{#each data.posts as post} + +{/each} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/footer.svelte b/src/routes/(DefaultStyle)/footer.svelte new file mode 100644 index 0000000..a7d67ca --- /dev/null +++ b/src/routes/(DefaultStyle)/footer.svelte @@ -0,0 +1,77 @@ + + +
+
+
+ +
+ +
+
+ Copyright 2024 moris. +
+
+ + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/header.svelte b/src/routes/(DefaultStyle)/header.svelte new file mode 100644 index 0000000..d7d0728 --- /dev/null +++ b/src/routes/(DefaultStyle)/header.svelte @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/+page.server.ts b/src/routes/(DefaultStyle)/post/+page.server.ts new file mode 100644 index 0000000..990ac9b --- /dev/null +++ b/src/routes/(DefaultStyle)/post/+page.server.ts @@ -0,0 +1,9 @@ +import Metas from '$lib/server/Metadatas'; + +export async function load(){ + const postList = await Metas() + + let id = postList[0].postId + + return {id} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/+page.svelte b/src/routes/(DefaultStyle)/post/+page.svelte new file mode 100644 index 0000000..ad839a0 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/+page.svelte @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts b/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts new file mode 100644 index 0000000..03f6382 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/+page.server.ts @@ -0,0 +1,28 @@ +import Post from '$lib/server/LoadPost'; +import { remark } from 'remark' +import Perser from '$lib/components/Markdown' +import GithubSlugger from 'github-slugger'; + +export async function load({params}) { + + const md = await Post(params.slug); + + let persed = Perser(md.post) + + let mdast = remark().parse(md.post) + let headers = mdast.children.filter((i) => i.type=='heading').map((i)=>{ + let title = i.children[0].value + return {"depth": i.depth, "title": title} + }) + + const slugs = new GithubSlugger() + + let slugged = headers.map((x)=>x.depth ?slugs.slug(x.title):'').filter((x)=>x!='') + + return { + id: params.slug, + metadata: md.metadata, + post: persed, + heading: slugged, + } +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/[slug]/+page.svelte b/src/routes/(DefaultStyle)/post/[slug]/+page.svelte new file mode 100644 index 0000000..d8d4f89 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/+page.svelte @@ -0,0 +1,311 @@ + + + + + {data.metadata.title} | moris.day Blog + + + + + + {#if data.metadata.thumbnail} + + {/if} + + {#if !data.metadata.index} + + {/if} + + + +
+
+

{data.metadata.title}

+ +
+
+ Category: + {data.metadata.category} +
+ + {#if data.metadata.tags.length } +
+ +
+ Tags: + {#each data.metadata.tags as tag} + {tag} + {/each} +
+ {/if} + +
+ + {data.metadata.date.toLocaleDateString('sv-SE')} +
+
+ + {#if data.metadata.thumbnail} + thumbnail + {:else if data.metadata.emoji} +
thumbnail
+ {/if} + +
+ {@html data.post} +
+ +
+ {#if PUBLIC_POST_REPO} + +
+ {/if} + +
+
+ + +
+ + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/[slug]/profile.svelte b/src/routes/(DefaultStyle)/post/[slug]/profile.svelte new file mode 100644 index 0000000..258c240 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/profile.svelte @@ -0,0 +1,49 @@ +
+
+
+
+ moris icon +
+
+
moristest tube
+
+ +
+ 有機化学好きの大学生
電子工作やプログラムもいじります
誤字 文句 その他連絡→Misskey(Fediverse)
+
+
+ + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/post/[slug]/raw.md/+server.ts b/src/routes/(DefaultStyle)/post/[slug]/raw.md/+server.ts new file mode 100644 index 0000000..47effb2 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/raw.md/+server.ts @@ -0,0 +1,9 @@ +export const prerender = true + +import fs from 'node:fs'; +import { POST_DIR } from '$env/static/private'; + +export async function GET({params}) { + const raw = fs.readFileSync(`${POST_DIR}/Posts/${params.slug}.md`,{encoding:'utf-8'}) + return new Response(raw); +}; diff --git a/src/routes/(DefaultStyle)/post/[slug]/share.svelte b/src/routes/(DefaultStyle)/post/[slug]/share.svelte new file mode 100644 index 0000000..95f1622 --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/share.svelte @@ -0,0 +1,92 @@ + + +
Share
+
+ +
+ + + +
+
+ + + +
+ +
+ + + +
+
+ + diff --git a/src/routes/(DefaultStyle)/post/[slug]/toc.svelte b/src/routes/(DefaultStyle)/post/[slug]/toc.svelte new file mode 100644 index 0000000..afc158c --- /dev/null +++ b/src/routes/(DefaultStyle)/post/[slug]/toc.svelte @@ -0,0 +1,46 @@ + + + + + + + \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/tag/+page.server.ts b/src/routes/(DefaultStyle)/tag/+page.server.ts new file mode 100644 index 0000000..9e34e7a --- /dev/null +++ b/src/routes/(DefaultStyle)/tag/+page.server.ts @@ -0,0 +1,17 @@ +import Metadatas from "$lib/server/Metadatas"; + +export async function load() { + let metalist = await Metadatas() + + let tags: string[] = [] + + for (let meta of metalist){ + for (let tag of meta.metadata.tags) { + if (!tags.includes(tag)) { + tags.push(tag) + } + } + } + + return {tags} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/tag/+page.svelte b/src/routes/(DefaultStyle)/tag/+page.svelte new file mode 100644 index 0000000..147881b --- /dev/null +++ b/src/routes/(DefaultStyle)/tag/+page.svelte @@ -0,0 +1,9 @@ + + +{#each data.tags as tag} +
+ {tag} +
+{/each} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/tag/[slug]/+page.server.ts b/src/routes/(DefaultStyle)/tag/[slug]/+page.server.ts new file mode 100644 index 0000000..b227a3f --- /dev/null +++ b/src/routes/(DefaultStyle)/tag/[slug]/+page.server.ts @@ -0,0 +1,11 @@ +import Metadatas from "$lib/server/Metadatas"; + +export async function load({params}) { + const tag = params.slug + + const metalist = await Metadatas() + + const result = metalist.filter((meta)=>meta.metadata.tags.includes(tag)).map((meta)=>meta.postId) + + return {posts: result} +} \ No newline at end of file diff --git a/src/routes/(DefaultStyle)/tag/[slug]/+page.svelte b/src/routes/(DefaultStyle)/tag/[slug]/+page.svelte new file mode 100644 index 0000000..7afe2e5 --- /dev/null +++ b/src/routes/(DefaultStyle)/tag/[slug]/+page.svelte @@ -0,0 +1,8 @@ + + +{#each data.posts as post} + +{/each} \ No newline at end of file diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..5fd74ce --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = true; +export const trailingSlash = 'always'; \ No newline at end of file diff --git a/src/routes/code/+layout.ts b/src/routes/code/+layout.ts new file mode 100644 index 0000000..3013ed9 --- /dev/null +++ b/src/routes/code/+layout.ts @@ -0,0 +1 @@ +export const csr = false diff --git a/src/routes/code/+page.server.ts b/src/routes/code/+page.server.ts new file mode 100644 index 0000000..decb8b4 --- /dev/null +++ b/src/routes/code/+page.server.ts @@ -0,0 +1,12 @@ +import { POST_DIR } from '$env/static/private'; +import Path from 'node:path'; +import fs from 'node:fs'; + +export async function load({}) { + + const files = fs.readdirSync(`${POST_DIR}/Codes`); + + const codes = files.filter((content)=> Path.extname(content)=='.html') + + return {codes} +} \ No newline at end of file diff --git a/src/routes/code/+page.svelte b/src/routes/code/+page.svelte new file mode 100644 index 0000000..2c0f44e --- /dev/null +++ b/src/routes/code/+page.svelte @@ -0,0 +1,10 @@ + + +
    +{#each data.codes as code} +
  • {code}
  • +{/each} +
\ No newline at end of file diff --git a/src/routes/code/[slug]/+layout.svelte b/src/routes/code/[slug]/+layout.svelte new file mode 100644 index 0000000..289bd2b --- /dev/null +++ b/src/routes/code/[slug]/+layout.svelte @@ -0,0 +1,75 @@ + + + + + + +
+ +
+ {@render children()} +
+
+ + \ No newline at end of file diff --git a/src/routes/code/[slug]/+page.server.ts b/src/routes/code/[slug]/+page.server.ts new file mode 100644 index 0000000..4e60780 --- /dev/null +++ b/src/routes/code/[slug]/+page.server.ts @@ -0,0 +1,10 @@ +import { POST_DIR } from '$env/static/private'; +import fs from 'node:fs'; + +export async function load({params}) { + const code = params.slug.replace(/\.html$/, ""); + + const html = fs.readFileSync(`${POST_DIR}/Codes/${code}.html`, 'utf-8'); + + return {html} +} \ No newline at end of file diff --git a/src/routes/code/[slug]/+page.svelte b/src/routes/code/[slug]/+page.svelte new file mode 100644 index 0000000..6e46d8e --- /dev/null +++ b/src/routes/code/[slug]/+page.svelte @@ -0,0 +1,5 @@ + + +
{@html data.html}
\ No newline at end of file diff --git a/src/routes/code/[slug]/app.css b/src/routes/code/[slug]/app.css new file mode 100644 index 0000000..abee866 --- /dev/null +++ b/src/routes/code/[slug]/app.css @@ -0,0 +1,35 @@ +:root { + height: 100%; + background-color: var(--white-black); + + --back-color: white; /*rgb(240 238 245)*/ + --head-color: rgb(245, 245, 245); /*rgb(244 243 250)*/ + --divider-color: rgb(220 220 220); + --border-color: #bbb; + --shadow-color: #0009; + --white-black: #fff; + --font-color: #222; + + @media(prefers-color-scheme: dark){ + --back-color: rgb(43 48 55); + --head-color: rgb(58 60 66); + --divider-color: #222; + --border-color: #555; + --shadow-color: #000; + --white-black: #000; + --font-color: #f5f5f5; + } +} + +body { + margin: 0; + height: 100%; + background-color: var(--white-black); + color: var(--font-color); +} + +body:fullscreen { + padding: 10%; + background-image: url(https://moris.day/files/img/BigSur.avif); + background-size: cover; +} \ No newline at end of file diff --git a/src/routes/feed.rss/+server.ts b/src/routes/feed.rss/+server.ts new file mode 100644 index 0000000..3f643ec --- /dev/null +++ b/src/routes/feed.rss/+server.ts @@ -0,0 +1,46 @@ +export const prerender = true + +import path from 'node:path'; + +import Metadatas from '$lib/server/Metadatas'; +import { PUBLIC_HOSTNAME } from '$env/static/public'; + +/** @type {import('./$types').RequestHandler} */ +export async function GET() { + + let items = "" + let i = 0 + + const metalist = await Metadatas() + + for (let post of metalist){ + + let meta = post.metadata + let link = `https://${PUBLIC_HOSTNAME}/blog/post/${path.basename(post.postId, '.md')}` + + i++ + items += ` + + ${meta.title} + ${meta.description} + ${link} + ${meta.date.toUTCString()} + ${link} + ` + + if (i==15) {break} + } + + let rss = ` + + + moris.day blog RSSfeed + 工作とか化学とかプログラミングとか + https://moris.day/blog + ${(new Date()).toUTCString()} + ${items} + +` + + return new Response(rss); +}; diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..f563a9d --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,17 @@ +import adapter from '@sveltejs/adapter-static'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + + kit: { + adapter: adapter(), + paths: { + base: "/blog", + relative: false + } + } +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0b2d886 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..5b1c868 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,9 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()], + server: { + port: 5273 + } +});