Files
qncV4uni-app/scripts/gen-legal-pages.mjs

91 lines
3.3 KiB
JavaScript
Raw Normal View History

2026-05-16 15:47:07 +08:00
import fs from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const root = path.resolve(__dirname, '..')
const wv = path.resolve(root, '..', 'tyc-webview-v2', 'src', 'views')
function extractTemplate(vueSrc) {
const m = vueSrc.match(/<template>([\s\S]*?)<\/template>/)
return m ? m[1].trim() : ''
}
function convert(html) {
let s = html
s = s.replace(/<div class="p-4">/g, '<view>')
s = s.replace(/<div\b/g, '<view')
s = s.replace(/<\/div>/g, '</view>')
s = s.replace(/<span\b/g, '<text')
s = s.replace(/<\/span>/g, '</text>')
s = s.replace(/class="text-blue-500"/g, 'class="legal-link"')
s = s.replace(/class="mt-4 text-right text-sm text-gray-600"/g, 'class="legal-date legal-date-right"')
s = s.replace(/class="text-right text-sm"/g, 'class="legal-date legal-date-right"')
s = s.replace(/class="text-sm"/g, 'class="legal-date"')
s = s.replace(/class="mb-2 font-semibold"/g, 'class="legal-subhead"')
s = s.replace(/class="font-semibold"/g, 'class="legal-strong"')
s = s.replace(/class="mb-2 font-bold leading-relaxed"/g, 'class="legal-h3"')
s = s.replace(/class="mb-2 font-bold"/g, 'class="legal-h3"')
s = s.replace(/class="mb-4 text-center text-lg font-bold"/g, 'class="legal-page-title"')
s = s.replace(/class="indent-\[2em\]"/g, 'class="legal-indent"')
s = s.replace(/class="mb-4 leading-relaxed"/g, 'class="legal-block"')
s = s.replace(/class="leading-relaxed"/g, 'class="legal-para"')
s = s.replace(/class="mb-4"/g, 'class="legal-section"')
s = s.replace(/class="mt-2 leading-relaxed"/g, 'class="legal-block legal-mt"')
s = s.replace(/class="mt-2 font-bold"/g, 'class="legal-h4"')
s = s.replace(/class="mt-2"/g, 'class="legal-mt"')
s = s.replace(/class="mt-4"/g, 'class="legal-mt-lg"')
s = s.replace(/class="my-2"/g, 'class="legal-my"')
s = s.replace(/<p\b/g, '<view class="legal-p"')
s = s.replace(/<\/p>/g, '</view>')
s = s.replace(/<ol\b[^>]*>/g, '<view class="legal-ol">')
s = s.replace(/<\/ol>/g, '</view>')
s = s.replace(/<ul\b[^>]*>/g, '<view class="legal-ul">')
s = s.replace(/<\/ul>/g, '</view>')
s = s.replace(/<li>/g, '<view class="legal-li">')
s = s.replace(/<\/li>/g, '</view>')
return s
}
const definePageSnippet = title => `definePage({
style: {
navigationBarTitleText: '${title}',
navigationStyle: 'default',
navigationBarBackgroundColor: '#ffffff',
navigationBarTextStyle: 'black',
},
})`
function makePage(title, inner) {
return `<script setup lang="ts">
${definePageSnippet(title)}
</script>
<template>
<view class="legal-root">
<scroll-view scroll-y class="legal-scroll" :show-scrollbar="true">
<view class="legal-inner">
${inner}
</view>
</scroll-view>
</view>
</template>
<style scoped lang="scss">
@import './legal.scss';
</style>
`
}
const ua = fs.readFileSync(path.join(wv, 'UserAgreement.vue'), 'utf8')
const pp = fs.readFileSync(path.join(wv, 'PrivacyPolicy.vue'), 'utf8')
const uaBody = convert(extractTemplate(ua))
const ppBody = convert(extractTemplate(pp))
const outDir = path.join(root, 'src', 'pages', 'legal')
fs.mkdirSync(outDir, { recursive: true })
fs.writeFileSync(path.join(outDir, 'user-agreement.vue'), makePage('用户协议', uaBody))
fs.writeFileSync(path.join(outDir, 'privacy-policy.vue'), makePage('隐私政策', ppBody))
console.log('OK', outDir)