FMHY-Website/docs/.vitepress/transformer.ts
2024-08-26 16:06:54 +00:00

315 lines
9.6 KiB
TypeScript

/**
Copyright (c) taskylizard. All rights reserved.
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.
*/
import { basename } from 'pathe'
import type { Plugin } from 'vitepress'
import { replaceUnderscore, transformer } from './transformer/core'
import { excluded, getHeader } from './transformer/constants'
export function transforms(): Plugin {
return {
name: 'custom:transform-content',
enforce: 'pre',
transform(code, id) {
const _id = basename(id)
if (
id.endsWith('.md') &&
!excluded.includes(_id) &&
// check if it's a post
!id.includes('posts') &&
!id.includes('other')
) {
const header = getHeader(_id)
const contents = transform(code)
if (_id === 'beginners-guide.md') {
const _contents = transformGuide(contents)
return header + _contents
}
if (_id === 'storage.md') return header + contents
return header + transformLinks(contents)
}
}
}
}
export const transformGuide = (text: string): string =>
transformer(text)
.transform('Beginners Guide', [
{
name: 'TOC',
find: /\[TOC\]\n/gm,
replace: ''
},
{
name: 'TOC2',
find: /\*\*Table of Contents\*\*\n\[TOC2\]\n/gm,
replace: ''
},
{
name: 'Beginners Guide',
find: /# -> \*\*\*Beginners Guide to Piracy\*\*\* <-\n/gm,
replace: ''
},
{
name: 'Note',
find: /!!!note\s(.+?)\n/gm,
replace: '\n:::info\n$1\n:::\n'
},
{
name: 'Info',
find: /!!!info\s(.+?)\n/gm,
replace: '\n:::info\n$1\n:::\n'
},
{
name: 'Warning',
find: /!!!warning\s(.+?)\n/gm,
replace: ':::warning\n$1\n:::\n'
},
{
name: 'Quote',
find: />\s(.+?)\n/gm,
replace: '> $1\n\n'
},
{
name: 'Back to Top',
find: /\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*/gm,
replace: ''
},
{
name: 'Back to Top',
find: /\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*/gm,
replace: ''
}
])
.getText()
export function transform(text: string): string {
let _text = text
// Transform reddit index links
.replace(
/\*\*\[◄◄ Back to Wiki Index\]\(https:\/\/www\.reddit\.com\/r\/FREEMEDIAHECKYEAH\/wiki\/index\)\*\*\n/gm,
''
)
.replace(
/\*\*\[◄◄ Back to Wiki Index\]\(https:\/\/www\.reddit\.com\/r\/FREEMEDIAHECKYEAH\/wiki\/tools-index\)\*\*\n/gm,
''
)
.replace(
/\*\*\[Table of Contents\]\(https?:\/\/.*?ibb\.co.*\)\*\* - For mobile users\n/gm,
''
)
// Remove extra lines
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n/gm, '')
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\* \n\n/gm, '')
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n/gm, '')
.replace(/\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n/gm, '')
.replace(/\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n/gm, '')
// Transform reddit links
.replace(/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/ai/g, '/ai')
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/adblock-vpn-privacy/g,
'/adblockvpnguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/android/g,
'/android-iosguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/games/g,
'/gamingpiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/reading/g,
'/readingpiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/download/g,
'/downloadpiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/torrent/g,
'/torrentpiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/edu/g,
'/edupiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/system-tools/g,
'/system-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/file-tools/g,
'/file-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/internet-tools/g,
'/internet-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/social-media/g,
'/social-media-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/text-tools/g,
'/text-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/video-tools/g,
'/video-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/audio-tools/g,
'/audio-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/game-tools/g,
'/gaming-tools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/video/g,
'/videopiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/audio/g,
'/audiopiracyguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/linux/g,
'/linuxguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/non-eng/g,
'/non-english'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/misc/g,
'/miscguide'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/storage/g,
'/storage'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/dev-tools/g,
'/devtools'
)
.replace(
/https:\/\/www.reddit.com\/r\/FREEMEDIAHECKYEAH\/wiki\/img-tools/g,
'/img-tools'
)
.replace(
/https:\/\/github.com\/nbats\/FMHYedit\/blob\/main\/base64.md#/g,
'/base64/#'
)
// Remove extra characters
.replace(/\/#wiki_/g, '/#')
.replace(/#wiki_/g, '/#')
.replace(/.25BA_/g, '')
.replace(/.25B7_/g, '')
.replace(/_.2F_/g, '-')
_text = replaceUnderscore(_text)
.replace(/\/#(\d)/g, '/#_$1') // Prefix headings starting with numbers
.replace(/#(\d)/g, '#_$1') // Prefix headings starting with numbers
.replace(/\/#/g, '#')
.replace(/\*\*\*\n\n/gm, '')
.replace(/\*\*\*\n/gm, '')
.replace(/# ►/g, '##')
.replace(/## ▷/g, '###')
.replace(/####/g, '###')
// Replace emojis
.replace(/⭐/g, ':star:')
.replace(/🌐/g, ':globe-with-meridians:')
.replace(/↪/g, ':repeat-button:')
// Replace note/warning/tip
.replace(/^\*\*Note\*\* - (.+)$/gm, ':::tip\n$1\n:::')
.replace(/^\* \*\*Note\*\* - (.+)$/gm, ':::tip\n$1\n:::')
.replace(/^Note - (.+)$/gm, ':::tip\n$1\n:::')
.replace(/^\*\*Warning\*\* - (.+)$/gm, ':::warning\n$1\n:::')
.replace(/^\* \*\*Warning\*\* - (.+)$/gm, ':::warning\n$1\n:::')
.replace(/^\*\s([^*])/gm, '- $1')
// Replace links
.replace(
/\/storage\/#encode--decode_urls/g,
'/storage/#encode--decode-urls'
)
.replace(/\/base64\/#do-k-ument/g, '/base64/#do_k_ument')
.replace(/\/devtools\/#machine-learning2/g, '/devtools/#machine-learning-1')
.replace(/\/linuxguide#software-sites2/g, '/linuxguide#software-sites-1')
.replace(/\/linuxguide#software_sites/g, '/linuxguide#software-sites')
.replace(/\/non-english#reading10/g, '/non-english#reading-9')
.replace(
/\/storage#satellite-.26amp.3B_street_view_maps/g,
'/storage#satellite-street-view-maps'
)
.replace(
/(.+?) site or extension\.\n/gm,
'Click on the texts to copy them decoded.\n'
)
return _text
}
const transformLinks = (text: string): string =>
transformer(text)
.transform('Links to Icons', [
{
name: 'Discord',
find: /\[Discord\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="Discord" class="i-carbon:logo-discord" /></a>'
},
{
name: 'GitHub',
find: /\[GitHub\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="GitHub" class="i-carbon:logo-github mb-1" /></a>'
},
{
name: 'GitHub Fallback',
find: /\[Github\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="GitHub" class="i-carbon:logo-github mb-1" /></a>'
},
{
name: 'GitLab',
find: /\[GitLab\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="GitLab" class="i-carbon:logo-gitlab" /></a>'
},
{
name: 'GitLab Fallback',
find: /\[Gitlab\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="GitLab" class="i-carbon:logo-gitlab" /></a>'
},
{
name: 'Telegram',
find: /\[Telegram\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="Telegram" class="i-mdi:telegram" /></a>'
},
{
name: 'Subreddit',
find: /\[Subreddit\]\(([^\)]*?)\)/gm,
replace:
'<a target="_blank" href="$1"><div alt="Reddit" class="i-mdi:reddit" /></a>'
}
])
.getText()