aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-03-30 14:16:47 +0800
committer苏向夜 <fu050409@163.com>2024-03-30 14:16:47 +0800
commit1fcaf30160ba684131e0fed2e8776b2be8d6f1f1 (patch)
tree32dab5c79eabdb1ee0c0ff0989404d78b06d763e /src
parentec1b692365741e1594a45f8f1bbd1687428ab08f (diff)
downloadipm-1fcaf30160ba684131e0fed2e8776b2be8d6f1f1.tar.gz
ipm-1fcaf30160ba684131e0fed2e8776b2be8d6f1f1.zip
feat(const): add vue code
Diffstat (limited to 'src')
-rw-r--r--src/ipm/const.py274
1 files changed, 272 insertions, 2 deletions
diff --git a/src/ipm/const.py b/src/ipm/const.py
index 1332143..52a3739 100644
--- a/src/ipm/const.py
+++ b/src/ipm/const.py
@@ -21,10 +21,14 @@ GITIGNORE = """# Initialized `.gitignores` @generated by IPM.
__pycache__/
*.pyc
-# Builds
+# IPM Builds
.ipm-build/
dist/
+# Cached Databases
+*.db
+*.sqlite3
+
# Distribution / packaging
eggs/
.eggs/
@@ -69,7 +73,7 @@ MANIFEST
__pypackages__/
# Environments
-.env
+.env*
.venv
env/
venv/
@@ -77,3 +81,269 @@ ENV/
env.bak/
venv.bak/
"""
+
+VUE_CODE = """<script setup lang="ts">
+import Header from '@/components/Header.vue';
+import MarkdownIt from 'markdown-it';
+import plainData from './index.json';
+import Card from 'primevue/card';
+import Button from 'primevue/button';
+import TabView from 'primevue/tabview';
+import TabPanel from 'primevue/tabpanel';
+import Panel from 'primevue/panel';
+import Tag from 'primevue/tag';
+import DataTable from 'primevue/datatable';
+import Column from 'primevue/column';
+import packages from '@/scripts/packages';
+
+const jsonData: any = plainData;
+const index = packages[jsonData.metadata.name];
+const distributions = index.distributions;
+
+const md = new MarkdownIt();
+
+function slice_url(urlString: string, host: boolean = true): string {
+ const url = new URL(urlString)
+ if (host) {
+ return url.host + url.pathname.slice(1)
+ } else {
+ return url.pathname.slice(1)
+ }
+}
+
+function link_to(url: string, blank?: boolean) {
+ if (blank == true) {
+ window.open(url, "_blank")
+ } else {
+ window.location.href = url;
+ }
+}
+
+function tablize(data: { [key: string]: string }): {
+ name: string;
+ desc: unknown;
+}[] {
+ return Object.entries(data).map(([key, value]) => {
+ return { name: key, desc: md.render(value) };
+ })
+}
+</script>
+
+<template>
+ <main>
+ <Header></Header>
+ <div class="w-full flex align-items-center justify-content-center">
+ <div class="w-full flex flex-column align-items-start justify-content-center pt-6 p-3 gap-6"
+ style="max-width: 960px;">
+ <Card class="w-full">
+ <template #title>
+ <div class="header gap-3 align-items-center justify-content-between">
+ <h1 class="text-5xl">
+ {{ jsonData.metadata.name }}
+ <span class="text-base text-gray-400">v{{ jsonData.metadata.version }}</span>
+ </h1>
+ <div>
+ <Button v-if="jsonData.metadata.urls.homepage !== undefined"
+ @click="link_to(jsonData.metadata.urls.homepage, true)" icon="pi pi-home" plain
+ text></Button>
+ <Button v-if="jsonData.metadata.urls.repository !== undefined"
+ @click="link_to(jsonData.metadata.urls.repository, true)" icon="pi pi-github" plain
+ text></Button>
+ </div>
+ </div>
+ </template>
+ <template #content>
+ <p class="mt-0 mb-1">
+ {{ jsonData.metadata.description }}
+ </p>
+ </template>
+ <template #footer>
+ <div class="flex flex-row flex-wrap gap-3">
+ <div v-for="topic in jsonData.metadata.topics">
+ <Tag :value="`#${topic}`"></Tag>
+ </div>
+ </div>
+ </template>
+ </Card>
+
+ <TabView class="w-full md">
+ <TabPanel header="自述">
+ <div class="readme pt-2">
+ <div>
+ <Card>
+ <template #content>
+ <div v-html="md.render(jsonData.readme)"></div>
+ </template>
+ </Card>
+ </div>
+ <div class="p-3 pt-2 pr-0">
+ <div>
+ <h2 class="pl-1 text-lg">元数据</h2>
+ <div class="flex flex-column align-items-start pb-1">
+ <Button icon="pi pi-calendar-plus" :label="jsonData.doc_create_at" plain
+ text></Button>
+ <Button plain text>
+ <div class="flex flex-row flex-wrap gap-2">
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor"
+ viewBox="0 0 100 100" width="17" height="17">
+ <path
+ d="M40 62.5h-.003c0-2.528.21-1.364-13.29-28.36-2.757-5.515-10.654-5.526-13.416 0C-.322 61.366.003 60.051.003 62.5H0C0 69.403 8.955 75 20 75s20-5.597 20-12.5zm-20-25L31.25 60H8.75zm79.997 25c0-2.528.21-1.364-13.29-28.36-2.757-5.515-10.654-5.526-13.416 0C59.678 61.366 60.003 60.051 60.003 62.5H60C60 69.403 68.955 75 80 75s20-5.597 20-12.5zM68.75 60L80 37.5 91.25 60zM82.5 80H55V33.945c3.673-1.608 6.431-4.918 7.248-8.945H82.5a2.5 2.5 0 002.5-2.5v-5a2.5 2.5 0 00-2.5-2.5H59.944c-2.282-3.019-5.867-5-9.944-5-4.077 0-7.662 1.981-9.944 5H17.5a2.5 2.5 0 00-2.5 2.5v5a2.5 2.5 0 002.5 2.5h20.252c.817 4.025 3.573 7.337 7.248 8.945V80H17.5a2.5 2.5 0 00-2.5 2.5v5a2.5 2.5 0 002.5 2.5h65a2.5 2.5 0 002.5-2.5v-5a2.5 2.5 0 00-2.5-2.5z">
+ </path>
+ </svg>
+ <span class="text-cascadia">
+ {{ jsonData.metadata.license }}
+ </span>
+ </div>
+ </Button>
+ </div>
+ </div>
+ <div>
+ <h2 class="pl-2 text-lg">安装</h2>
+ <div class="flex flex-column align-items-start pb-1 pt-1 p-3 gap-3">
+ <Panel header="IPM 安装" class="w-full">
+ <pre class="m-0"><code>ipm add {{ jsonData.metadata.name }}</code></pre>
+ </Panel>
+ <Panel header="使用 infini.toml" class="w-full">
+ <pre class="m-0"><code>{{ jsonData.metadata.name }} = "{{ jsonData.metadata.version
+ }}"</code></pre>
+ </Panel>
+ </div>
+ </div>
+ <div v-if="jsonData.metadata.urls.homepage !== undefined">
+ <h2 class="pl-2 text-lg">主页</h2>
+ <div class="flex flex-column align-items-start pb-1">
+ <Button @click="link_to(jsonData.metadata.urls.homepage)" icon="pi pi-link"
+ :label="slice_url(jsonData.metadata.urls.homepage)"
+ class="w-full flex flex-row justify-content-start" plain text>
+ </Button>
+ </div>
+ </div>
+ <div v-if="jsonData.metadata.urls.documentation !== undefined">
+ <h2 class="pl-2 text-lg">文档</h2>
+ <div class="flex flex-column align-items-start pb-1">
+ <Button @click="link_to(jsonData.metadata.urls.documentation)" icon="pi pi-box"
+ :label="slice_url(jsonData.metadata.urls.documentation)" class="w-full"
+ plain text>
+ </Button>
+ </div>
+ </div>
+ <div v-if="jsonData.metadata.urls.repository !== undefined">
+ <h2 class="pl-2 text-lg">仓库</h2>
+ <div class="flex flex-column align-items-start pb-1">
+ <Button @click="link_to(jsonData.metadata.urls.repository)" icon="pi pi-github"
+ :label="slice_url(jsonData.metadata.urls.repository, false)" class="w-full"
+ plain text>
+ </Button>
+ </div>
+ </div>
+ <div>
+ <h2 class="pl-2 text-lg">作者</h2>
+ <div class="flex flex-column align-items-start pb-1">
+ <div v-for="author in jsonData.metadata.authors">
+ <Button icon="pi pi-user" :label="author.name" plain text></Button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </TabPanel>
+ <TabPanel header="指令文档">
+ <Panel header="规则包指令">
+ <div v-for="(event, name) in jsonData.handlers">
+ <h2><code>{{ name }}</code>指令</h2>
+ <span v-if="event.description !== null" class="text-gray-400 pl-2">{{
+ event.description
+ }}</span>
+ <pre v-if="event.usage !== null"><code>{{ event.usage }}</code></pre>
+ <div class="p-1" v-html="md.render(event.content)"></div>
+ <div v-for="(cmd, name) in event.sub_cmd">
+ <h3><code>{{ name }}</code>选项</h3>
+ <span v-if="cmd.description !== null" class="text-gray-400 pl-2">{{
+ cmd.description
+ }}</span>
+ <pre v-if="event.usage !== null"><code>{{ cmd.usage }}</code></pre>
+ <div class="p-1" v-html="md.render(cmd.content)"></div>
+ </div>
+ </div>
+ </Panel>
+ </TabPanel>
+ <TabPanel v-if="jsonData.events" header="消息事件">
+ <Panel header="消息事件">
+ <div v-for="(event, name) in jsonData.events">
+ <h2><code>{{ name }}</code></h2>
+ <span v-if="event.description !== null" class="text-gray-400 pl-2">{{ event.description
+ }}</span>
+ <div></div>
+ <div class="p-1" v-if="event.content !== null" v-html="md.render(event.content)"></div>
+ <DataTable class="m-2 p-2" showGridlines stripedRows
+ v-if="Object.keys(event.var_doc).length !== 0" :value="tablize(event.var_doc)">
+ <Column field="name" header="变量"></Column>
+ <Column field="desc" header="描述">
+ <template #body="slotProps">
+ <div v-html="slotProps.data.desc"></div>
+ </template>
+ </Column>
+ </DataTable>
+ </div>
+ </Panel>
+ </TabPanel>
+ <TabPanel v-if="Object.keys(jsonData.global_variables).length !== 0" header="全局变量">
+ <Panel header="全局变量">
+ <div v-for="(event, name) in jsonData.global_variables">
+ <h2><code>{{ name }}</code></h2>
+ <span v-if="event.description !== null" class="text-gray-400 pl-2">{{ event.description
+ }}</span>
+ <pre v-if="event.usage !== null"><code>{{ event.usage }}</code></pre>
+ <div class="p-1" v-if="event.content !== null" v-html="md.render(event.content)"></div>
+ </div>
+ </Panel>
+ </TabPanel>
+ <TabPanel v-if="Object.keys(jsonData.interceptors).length !== 0" header="拦截器">
+ <Panel header="拦截器">
+ <div v-for="(event, name) in jsonData.interceptors">
+ <h2><code>{{ name }}</code>拦截器</h2>
+ <span v-if="event.description !== null" class="text-gray-400 pl-2">{{ event.description
+ }}</span>
+ <pre v-if="event.usage !== null"><code>{{ event.usage }}</code></pre>
+ <div class="p-1" v-if="event.content !== null" v-html="md.render(event.content)"></div>
+ </div>
+ </Panel>
+ </TabPanel>
+ <TabPanel v-if="distributions !== undefined" header="依赖"></TabPanel>
+ </TabView>
+ </div>
+ </div>
+ </main>
+</template>
+
+<style scoped>
+:deep(.p-button-label) {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ flex: 0 1 auto;
+}
+
+.header {
+ display: flex;
+ align-items: baseline;
+ flex-wrap: wrap;
+ margin: 0;
+ padding: 0;
+ word-break: break-word;
+ font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
+ font-weight: bold;
+}
+
+.text-cascadia {
+ font-family: 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
+}
+
+@media only screen and (min-width: 890px) {
+ .readme {
+ display: grid;
+ grid-template-columns: minmax(0, 7fr) minmax(0, 3fr);
+ }
+}
+</style>
+""" \ No newline at end of file