mirror of
https://github.com/fmhy/edit.git
synced 2025-07-30 07:42:18 +10:00
feat: build env options, formatting, selfhosting guide
This commit is contained in:
parent
88a1a989d9
commit
929bd44275
39 changed files with 268 additions and 764 deletions
|
@ -1,6 +1,3 @@
|
|||
> [!NOTE]
|
||||
> The website is no longer receiving new features and is now in maintenance mode. Please refrain from opening issues or pull requests.
|
||||
|
||||
This is the website source code to be used with [VitePress](https://vitepress.dev/).
|
||||
|
||||
Licensed under the Apache License v2.0, see [LICENSE](./LICENSE) for more information.
|
||||
|
|
|
@ -18,7 +18,7 @@ import { generateFeed, generateImages, generateMeta } from './hooks'
|
|||
import { defs, emojiRender, movePlugin } from './markdown/emoji'
|
||||
import { headersPlugin } from './markdown/headers'
|
||||
import { toggleStarredPlugin } from './markdown/toggleStarred'
|
||||
import { transforms } from './transformer'
|
||||
import { transformsPlugin } from './transformer'
|
||||
|
||||
// @unocss-include
|
||||
|
||||
|
@ -116,7 +116,7 @@ export default defineConfig({
|
|||
filepath: './.cache/imports.json'
|
||||
}
|
||||
}),
|
||||
transforms(),
|
||||
transformsPlugin(),
|
||||
{
|
||||
name: 'custom:adjust-order',
|
||||
configResolved(c) {
|
||||
|
@ -145,7 +145,7 @@ export default defineConfig({
|
|||
config(md) {
|
||||
md.use(emojiRender)
|
||||
md.use(toggleStarredPlugin)
|
||||
md.use(headersPlugin)
|
||||
meta.build.api && md.use(headersPlugin)
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
import type { DefaultTheme } from 'vitepress'
|
||||
import consola from 'consola'
|
||||
import { transform, transformGuide } from './transformer'
|
||||
|
||||
// @unocss-include
|
||||
|
@ -23,14 +24,31 @@ export const meta = {
|
|||
name: 'freemediaheckyeah',
|
||||
description: 'The largest collection of free stuff on the internet!',
|
||||
hostname: 'https://fmhy.net',
|
||||
keywords: ['stream', 'movies', 'gaming', 'reading', 'anime']
|
||||
keywords: ['stream', 'movies', 'gaming', 'reading', 'anime'],
|
||||
build: {
|
||||
api: true,
|
||||
nsfw: true
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.FMHY_BUILD_NSFW === 'false') {
|
||||
consola.info('FMHY_BUILD_NSFW is set to false, disabling NSFW content')
|
||||
meta.build.nsfw = false
|
||||
}
|
||||
if (process.env.FMHY_BUILD_API === 'false') {
|
||||
consola.info('FMHY_BUILD_API is set to false, disabling API component')
|
||||
meta.build.api = false
|
||||
}
|
||||
|
||||
const formatCommitRef = (commitRef: string) =>
|
||||
`<a href="https://github.com/fmhy/edit/commit/${commitRef}">${commitRef.slice(0, 8)}</a>`
|
||||
|
||||
export const commitRef =
|
||||
process.env.CF_PAGES && process.env.CF_PAGES_COMMIT_SHA
|
||||
? `<a href="https://github.com/fmhy/edit/commit/${process.env.CF_PAGES_COMMIT_SHA
|
||||
}">${process.env.CF_PAGES_COMMIT_SHA.slice(0, 8)}</a>`
|
||||
: 'dev'
|
||||
? formatCommitRef(process.env.CF_PAGES_COMMIT_SHA)
|
||||
: process.env.COMMIT_REF
|
||||
? formatCommitRef(process.env.COMMIT_REF)
|
||||
: 'dev'
|
||||
|
||||
export const feedback = `<a href="/feedback" class="feedback-footer">Made with ❤</a>`
|
||||
|
||||
|
@ -113,17 +131,11 @@ export const socialLinks: DefaultTheme.SocialLink[] = [
|
|||
{ icon: 'github', link: 'https://github.com/fmhy/edit' },
|
||||
{ icon: 'discord', link: 'https://rentry.co/fmhy-invite' },
|
||||
{
|
||||
ariaLabel: 'Reddit',
|
||||
icon: {
|
||||
svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Reddit</title><path d="M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z"/></svg>'
|
||||
},
|
||||
icon: 'reddit',
|
||||
link: 'https://reddit.com/r/FREEMEDIAHECKYEAH'
|
||||
},
|
||||
{
|
||||
ariaLabel: 'Bluesky',
|
||||
icon: {
|
||||
svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Bluesky</title><path d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364.136-.02.275-.039.415-.056-.138.022-.276.04-.415.056-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a8.741 8.741 0 0 1-.415-.056c.14.017.279.036.415.056 2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8Z"/></svg>'
|
||||
},
|
||||
icon: 'bluesky',
|
||||
link: 'https://bsky.app/profile/fmhy.net'
|
||||
}
|
||||
]
|
||||
|
@ -141,14 +153,21 @@ export const nav: DefaultTheme.NavItem[] = [
|
|||
{ text: '🔗 Bookmarks', link: 'https://github.com/fmhy/bookmarks' },
|
||||
{ text: '✅ SafeGuard', link: 'https://github.com/fmhy/FMHY-SafeGuard' },
|
||||
{ text: '📋 snowbin', link: 'https://pastes.fmhy.net' },
|
||||
{ text: '💡 Site Hunting', link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/' },
|
||||
{ text: '🏞 Wallpapers', link: '/other/wallpapers' },
|
||||
{ text: '💙 Feedback', link: '/feedback' },
|
||||
{
|
||||
text: '💡 Site Hunting',
|
||||
link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/'
|
||||
},
|
||||
{ text: '❓ FAQs', link: 'https://redd.it/xrxen7' },
|
||||
{
|
||||
text: '😇 SFW FMHY',
|
||||
link: 'https://fmhy.xyz/'
|
||||
}
|
||||
},
|
||||
{
|
||||
text: '🏠 Selfhosting',
|
||||
link: '/other/selfhosting'
|
||||
},
|
||||
{ text: '🏞 Wallpapers', link: '/other/wallpapers' },
|
||||
{ text: '💙 Feedback', link: '/feedback' }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
@ -166,8 +185,6 @@ export const sidebar: DefaultTheme.Sidebar | DefaultTheme.NavItemWithLink[] = [
|
|||
text: '<span class="i-twemoji:light-bulb"></span> Contribute',
|
||||
link: '/other/contributing'
|
||||
},
|
||||
|
||||
// TODO: genetate sidebar from posts
|
||||
{
|
||||
text: 'Wiki',
|
||||
collapsed: false,
|
||||
|
@ -280,10 +297,12 @@ export const sidebar: DefaultTheme.Sidebar | DefaultTheme.NavItemWithLink[] = [
|
|||
text: 'More',
|
||||
collapsed: true,
|
||||
items: [
|
||||
{
|
||||
text: '<span class="i-twemoji:no-one-under-eighteen"></span> NSFW',
|
||||
link: 'https://rentry.co/NSFW-Checkpoint'
|
||||
},
|
||||
meta.build.nsfw
|
||||
? {
|
||||
text: '<span class="i-twemoji:no-one-under-eighteen"></span> NSFW',
|
||||
link: 'https://rentry.co/NSFW-Checkpoint'
|
||||
}
|
||||
: {},
|
||||
{
|
||||
text: '<span class="i-twemoji:warning"></span> Unsafe Sites',
|
||||
link: '/unsafesites'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -21,6 +21,7 @@ export function generateMeta(context: TransformContext, hostname: string) {
|
|||
const { pageData } = context
|
||||
|
||||
if (pageData.isNotFound) return head
|
||||
if (Object.keys(pageData.frontmatter).length === 0) return head
|
||||
|
||||
const url = `${hostname}/${pageData.relativePath.replace(/((^|\/)index)?\.md$/, '$2')}`
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -88,14 +88,14 @@ async function generateImage({
|
|||
const _page = getPage(url)
|
||||
const title =
|
||||
frontmatter.layout === 'home'
|
||||
? frontmatter.hero.name ?? frontmatter.title
|
||||
? (frontmatter.hero.name ?? frontmatter.title)
|
||||
: frontmatter.title
|
||||
? frontmatter.title
|
||||
: _page?.title
|
||||
|
||||
const description =
|
||||
frontmatter.layout === 'home'
|
||||
? frontmatter.hero.tagline ?? frontmatter.description
|
||||
? (frontmatter.hero.tagline ?? frontmatter.description)
|
||||
: frontmatter.description
|
||||
? frontmatter.description
|
||||
: _page?.description
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -22,7 +22,7 @@ import { Feed } from 'feed'
|
|||
import { createContentLoader } from 'vitepress'
|
||||
import { meta } from '../constants'
|
||||
|
||||
export async function generateFeed(config: SiteConfig): Promise {
|
||||
export async function generateFeed(config: SiteConfig): Promise<void> {
|
||||
const feed: Feed = new Feed({
|
||||
id: meta.hostname,
|
||||
link: meta.hostname,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* Copyright (c) 2024 taskylizard
|
||||
*
|
||||
|
@ -53,10 +68,10 @@ export const headersPlugin = (md: MarkdownRenderer) => {
|
|||
return result
|
||||
}
|
||||
|
||||
let defaultRender = md.renderer.rules.link_open
|
||||
const defaultRender = md.renderer.rules.link_open
|
||||
|
||||
md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
|
||||
const result = defaultRender!!!!!!!!!!!(tokens, idx, options, env, self)
|
||||
const result = defaultRender!!!!!!!!!!(tokens, idx, options, env, self)
|
||||
|
||||
const meta = tokens[idx].meta
|
||||
if (!meta || !meta.feedback) return result
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
<script setup lang="ts">
|
||||
import type { FeedbackType } from '../../types/Feedback'
|
||||
import { useRouter } from 'vitepress'
|
||||
import { computed, reactive, ref } from 'vue'
|
||||
import { feedbackOptions, getFeedbackOption, type FeedbackType } from '../../types/Feedback'
|
||||
import { feedbackOptions, getFeedbackOption } from '../../types/Feedback'
|
||||
|
||||
const props = defineProps<{
|
||||
heading?: string
|
||||
|
|
|
@ -3,7 +3,7 @@ import type { EnhanceAppContext } from 'vitepress'
|
|||
import nprogress from 'nprogress'
|
||||
|
||||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -19,7 +19,7 @@ import { basename } from 'pathe'
|
|||
import { excluded, getHeader } from './transformer/constants'
|
||||
import { replaceUnderscore, transformer } from './transformer/core'
|
||||
|
||||
export function transforms(): Plugin {
|
||||
export function transformsPlugin(): Plugin {
|
||||
return {
|
||||
name: 'custom:transform-content',
|
||||
enforce: 'pre',
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import { meta } from '../constants'
|
||||
|
||||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -146,7 +148,7 @@ export function getHeader(id: string) {
|
|||
|
||||
const description = '<p class="text-black dark:text-text-2">'
|
||||
|
||||
const feedback = '<Feedback />'
|
||||
const feedback = meta.build.api ? '<Feedback />' : ''
|
||||
|
||||
const data = headers[id]
|
||||
let header = '---\n'
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -30,8 +30,8 @@ interface Replacer {
|
|||
}
|
||||
|
||||
export const transformer = (text: string) => {
|
||||
const handler: ProxyHandler = {
|
||||
get(target, prop) {
|
||||
const handler: ProxyHandler<{ text: string }> = {
|
||||
get(target: { text: string }, prop: string | symbol) {
|
||||
if (prop === 'transform') {
|
||||
return (name: string, transforms: Transform[]): Replacer => {
|
||||
consola.debug(`Starting transform ${name} with ${transforms}`)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
2
docs/.vitepress/vue-shim.d.ts
vendored
2
docs/.vitepress/vue-shim.d.ts
vendored
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* Copyright (c) taskylizard. All rights reserved.
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue