├── .gitignore ├── .vscode └── settings.json ├── .prettierrc ├── utils ├── index.ts └── fetchReadmeToHtml.ts ├── app.ts ├── functions ├── baike │ ├── utils │ │ ├── ensureLink.ts │ │ ├── ensureTitle.ts │ │ ├── fetchItemLink.ts │ │ └── responseWithBaseRes.ts │ ├── app.ts │ ├── README.md │ └── services │ │ ├── fetchItemList.ts │ │ ├── fetchTodayInHistory.ts │ │ └── fetchItem.ts ├── get-qrcode │ ├── README.md │ └── app.ts └── markdown2html │ ├── app.ts │ ├── md2html.ts │ ├── README.md │ └── css │ └── gfm.css ├── deno.json ├── LICENSE ├── README.md └── deno.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.lint": true, 4 | "deno.unstable": false 5 | } 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "jsxSingleQuote": true, 5 | "printWidth": 100, 6 | "htmlWhitespaceSensitivity": "strict" 7 | } 8 | -------------------------------------------------------------------------------- /utils/index.ts: -------------------------------------------------------------------------------- 1 | import { fetchReadmeToHtml } from './fetchReadmeToHtml.ts' 2 | 3 | const PORT = Number(Deno.env.get('PORT')) || 8000 4 | const dirname = (metaUrl: string) => new URL('.', metaUrl).pathname 5 | 6 | export { dirname, fetchReadmeToHtml, PORT } 7 | -------------------------------------------------------------------------------- /app.ts: -------------------------------------------------------------------------------- 1 | import { fetchReadmeToHtml } from './utils/fetchReadmeToHtml.ts' 2 | 3 | Deno.serve(async (request: Request) => { 4 | const url = new URL(request.url) 5 | 6 | if (url.pathname === '/favicon.ico') { 7 | return fetch('https://avatar.viki.moe') 8 | } 9 | 10 | return await fetchReadmeToHtml(import.meta.url) 11 | }) 12 | -------------------------------------------------------------------------------- /functions/baike/utils/ensureLink.ts: -------------------------------------------------------------------------------- 1 | export const ensureLink = (link: string | null, removeSearchParams = false) => { 2 | if (!link) { 3 | return '' 4 | } 5 | 6 | link = link.replace(/^http:/, 'https:') 7 | link = link.replace(/^\/item/, 'https://baike.baidu.com/item') 8 | 9 | if (removeSearchParams) { 10 | link = link.split('?')[0] 11 | } 12 | 13 | return link 14 | } 15 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "dev:root": "deno run --allow-all --watch ./app.ts", 4 | "dev:baike": "deno run --allow-all --watch ./functions/baike/app.ts", 5 | "dev:qrcode": "deno run --allow-all --watch ./functions/get-qrcode/app.ts", 6 | "dev:md2html": "PORT=3888 deno run --allow-all --watch ./functions/markdown2html/app.ts" 7 | }, 8 | "lint": { 9 | "rules": { 10 | "exclude": ["no-explicit-any"] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /functions/baike/utils/ensureTitle.ts: -------------------------------------------------------------------------------- 1 | const RegChars: [string, string][] = [ 2 | ['&amp;', '&'], 3 | ['&', '&'], 4 | ['>', '>'], 5 | ['<', '<'], 6 | [' ', ' '], 7 | ['"', '"'], 8 | [''', "'"], 9 | ['×', '×'], 10 | ['÷', '÷'], 11 | ] 12 | 13 | export const ensureTitle = (title: string) => { 14 | title = title.split('_')[0] 15 | 16 | RegChars.forEach((pair) => { 17 | const reg = new RegExp(pair[0], 'g') 18 | title = title.replace(reg, pair[1]) 19 | }) 20 | 21 | return title 22 | } 23 | -------------------------------------------------------------------------------- /utils/fetchReadmeToHtml.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'https://deno.land/std@0.149.0/path/mod.ts' 2 | 3 | const MD_TO_HTML_API = Deno.env.get('DEV') 4 | ? 'http://localhost:3000' 5 | : 'https://markdown2html.deno.dev' 6 | 7 | const README_FILE_NAME = 'README.md' 8 | 9 | export const fetchReadmeToHtml = async (metaUrl: string) => { 10 | const { pathname } = new URL('.', metaUrl) 11 | const readmePath = path.join(pathname, README_FILE_NAME) 12 | 13 | const markdownContent = await Deno.readTextFile(readmePath) 14 | 15 | const res = await fetch(MD_TO_HTML_API, { 16 | method: 'POST', 17 | body: markdownContent, 18 | }) 19 | 20 | return res 21 | } 22 | -------------------------------------------------------------------------------- /functions/baike/utils/fetchItemLink.ts: -------------------------------------------------------------------------------- 1 | const linkCache = new Map() 2 | 3 | const getSuggestApi = (item: string) => { 4 | return `https://baike.baidu.com/api/searchui/suggest?wd=${item}&enc=utf8` 5 | } 6 | 7 | export const fetchItemLink = async (itemName: string) => { 8 | if (linkCache.has(itemName)) { 9 | return linkCache.get(itemName) || '' 10 | } 11 | 12 | const res = await fetch(getSuggestApi(itemName)) 13 | const { list } = await res.json() 14 | const item = list[0] 15 | 16 | if (!item) return '' 17 | 18 | const link = `https://baike.baidu.com/item/${encodeURIComponent(item.lemmaTitle)}/${item.lemmaId}` 19 | 20 | linkCache.set(itemName, link) 21 | 22 | return link 23 | } 24 | -------------------------------------------------------------------------------- /functions/get-qrcode/README.md: -------------------------------------------------------------------------------- 1 | # Get QR Code API 2 | 3 | [![github-label](https://img.shields.io/badge/gitub-000000?style=for-the-badge&logo=github)](https://github.com/vikiboss/deno-functions/tree/main/functions/get-qrcode) 4 | 5 | Generate a QR code image by passing a `text` parameter and optional `size`. 6 | 7 | ## Usage 8 | 9 | ```ts 10 | const api = 'https://get-qrcode.deno.dev' 11 | 12 | const text = 'Hello World' 13 | const size = 256 14 | 15 | // blob data 16 | const res = await fetch(`${api}?text=${text}&size=${size}`) 17 | 18 | // base64 string (Data URI scheme: `data:image/gif;base64,xxxxxxxxxx`) 19 | const res = await fetch(`${api}?text=${text}&size=${size}&base64`) 20 | ``` 21 | 22 | [⬅ back to list](https://viki.deno.dev/) 23 | -------------------------------------------------------------------------------- /functions/baike/utils/responseWithBaseRes.ts: -------------------------------------------------------------------------------- 1 | export const responseWithBaseRes = ( 2 | obj: Record | string | number | boolean | null | undefined, 3 | status = 200, 4 | message = 'OK' 5 | ) => { 6 | let res = '' 7 | 8 | try { 9 | res = JSON.stringify({ status, message, data: obj ?? {} }) 10 | } catch { 11 | res = JSON.stringify({ status, message: 'Oops', data: {} }) 12 | } 13 | 14 | return new Response(res, { 15 | headers: { 16 | 'content-type': 'application/json; charset=utf-8', 17 | }, 18 | }) 19 | } 20 | 21 | export function transferText(str: string, mode: 'u2a' | 'a2u') { 22 | if (mode === 'a2u') { 23 | return str.replace(/&#(\d+);/g, (_, $1) => String.fromCharCode(Number($1))) 24 | } else { 25 | return str.replace(/./, (_) => `&#${_.charCodeAt(0)};`) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /functions/markdown2html/app.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'node:path' 2 | 3 | import { dirname, PORT } from '../../utils/index.ts' 4 | import { md2html } from './md2html.ts' 5 | 6 | const README_PATH = path.join(dirname(import.meta.url), 'README.md') 7 | 8 | const RES_OPTIONS = { 9 | headers: { 10 | 'Content-Type': 'text/html', 11 | }, 12 | } 13 | 14 | Deno.serve({ port: PORT, hostname: 'localhost' }, async (request: Request) => { 15 | const url = new URL(request.url) 16 | 17 | if (url.pathname === '/favicon.ico') { 18 | return new Response(null) 19 | } 20 | 21 | let md = '' 22 | let title = '' 23 | 24 | if (!request.body) { 25 | md = await Deno.readTextFile(README_PATH) 26 | } else { 27 | md = await request.text() 28 | title = new URL(request.url).searchParams.get('title') || '' 29 | } 30 | 31 | return new Response(md2html(md, title), RES_OPTIONS) 32 | }) 33 | -------------------------------------------------------------------------------- /functions/get-qrcode/app.ts: -------------------------------------------------------------------------------- 1 | import { qrcode } from 'https://deno.land/x/qrcode@v2.0.0/mod.ts' 2 | import * as base64 from 'https://deno.land/x/base64@v0.2.1/mod.ts' 3 | 4 | import { fetchReadmeToHtml } from '../../utils/index.ts' 5 | 6 | const SLICE_START = 22 7 | const DEFAULT_SIZE = 256 8 | 9 | Deno.serve(async (request: Request) => { 10 | const url = new URL(request.url) 11 | const params = url.searchParams 12 | 13 | if (url.pathname === '/favicon.ico') { 14 | return new Response(null) 15 | } 16 | 17 | const text = decodeURIComponent(params.get('text') || '') 18 | 19 | if (!text) { 20 | return await fetchReadmeToHtml(import.meta.url) 21 | } 22 | 23 | const option = { 24 | size: Number(params.get('size')) || DEFAULT_SIZE, 25 | } 26 | 27 | const isBase64 = params.has('base64') 28 | const image = String(await qrcode(text, option)) 29 | 30 | return new Response(isBase64 ? image : base64.toUint8Array(image.slice(SLICE_START))) 31 | }) 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022-PRESENT Viki 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /functions/baike/app.ts: -------------------------------------------------------------------------------- 1 | import { fetchItem } from './services/fetchItem.ts' 2 | import { fetchItemList } from './services/fetchItemList.ts' 3 | import { fetchReadmeToHtml } from '../../utils/index.ts' 4 | import { fetchTodayInHistory } from './services/fetchTodayInHistory.ts' 5 | 6 | Deno.serve(async (request: Request) => { 7 | const url = new URL(request.url) 8 | const pathname = url.pathname 9 | const params = url.searchParams 10 | 11 | if (pathname === '/favicon.ico') { 12 | return new Response(null) 13 | } 14 | 15 | const encoding = params.get('encoding') || 'json' 16 | 17 | if (pathname === '/today_in_history') { 18 | return await fetchTodayInHistory(encoding) 19 | } 20 | 21 | if (pathname.startsWith('/item/')) { 22 | const item = pathname.replace(/^\/item\//, '') 23 | 24 | if (item) { 25 | const n = params.get('n') 26 | return await fetchItem(item, n, encoding) 27 | } 28 | } 29 | 30 | if (pathname.startsWith('/item_list/')) { 31 | const item = pathname.replace(/^\/item_list\//, '') 32 | 33 | if (item) { 34 | return await fetchItemList(item, encoding) 35 | } 36 | } 37 | 38 | return await fetchReadmeToHtml(import.meta.url) 39 | }) 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Viki's Deno Functions 2 | 3 | [![github-label](https://img.shields.io/badge/gitub-source%20code-000000?style=for-the-badge&logo=github)](https://github.com/vikiboss/deno-functions) 4 | 5 | A set of useful serverless **functions** powered by [Deno](https://deno.land/) and deployed by [Deno Deploy](https://deno.dev/). They're fast! 6 | 7 | ## Functions 8 | 9 | - [**Baidu Wiki API**](https://github.com/vikiboss/deno-functions/tree/main/functions/baike): https://baike.deno.dev 10 | 11 | 百度百科 API,获取词条信息、词条义项列表、历史上的今天。 12 | 13 | - [**Markdown to HTML API**](https://github.com/vikiboss/deno-functions/tree/main/functions/markdown2html): https://markdown2html.deno.dev 14 | 15 | Transform `Markdown` into `HTML` string, support many languages' sytax highlighting in code block. 16 | 17 | - [**Generate QR Code API**](https://github.com/vikiboss/deno-functions/tree/main/functions/get-qrcode): http://get-qrcode.deno.dev 18 | 19 | Generate QR code image by passing a `text` parameter and optional `size`. 20 | 21 | ## Thanks 22 | 23 | [KusStar/deno-serverless-functions](https://github.com/KusStar/deno-serverless-functions) 24 | 25 | ## License 26 | 27 | [MIT](https://github.com/vikiboss/deno-functions/tree/main/LICENSE) License © 2022-PRESENT Viki 28 | -------------------------------------------------------------------------------- /functions/baike/README.md: -------------------------------------------------------------------------------- 1 | # 百度百科 API 2 | 3 | [![github-label](https://img.shields.io/badge/gitub-000000?style=for-the-badge&logo=github)](https://github.com/vikiboss/deno-functions/tree/main/functions/baike) 4 | 5 | 百度百科 `词条信息`、`词条义项列表`、`历史上的今天` API。 6 | 7 | 支持模糊搜索匹配,比如:https://baike.deno.dev/item/xiyouji (西游记) 8 | 9 | ## 用法 10 | 11 | - 词条信息 12 | - JSON: https://baike.deno.dev/item/UFO 13 | - Text: https://baike.deno.dev/item/UFO?encoding=text 14 | - 词条列表 15 | - JSON: https://baike.deno.dev/item_list/UFO 16 | - Text: https://baike.deno.dev/item_list/UFO?encoding=text 17 | - 历史上的今天 18 | - JSON: https://baike.deno.dev/today_in_history 19 | - Text: https://baike.deno.dev/today_in_history?encoding=text 20 | 21 | ```ts 22 | const api = 'https://baike.deno.dev' 23 | 24 | // 通过 `词条名` 搜索并获取词条信息 25 | const item = 'UFO' 26 | const itemUrl = `${api}/item/${encodeURIComponent(item)}` 27 | const itemRes = await fetch(itemUrl) 28 | const itemData = await itemRes.json() 29 | 30 | // 通过 `词条名` 搜索并获取义项列表 31 | const item = 'UFO' 32 | const itemListUrl = `${api}/item_list/${encodeURIComponent(item)}` 33 | const itemListRes = await fetch(itemUrl) 34 | const itemListData = await itemRes.json() 35 | 36 | // 通过 `词条名` 和 `义项序号` 搜索并获取词条信息 (默认词条可能不是第一条) 37 | const item = 'UFO' 38 | const n = 2 39 | const itemUrl = `${api}/item/${encodeURIComponent(item)}?n=${n}` 40 | const itemRes = await fetch(itemUrl) 41 | const itemData = await itemRes.json() 42 | 43 | // 获取 `历史上的今天` 重大事件列表 44 | const hisUrl = `${api}/today_in_history` 45 | const hisRes = await fetch(hisUrl) 46 | const hisData = await hisRes.json() 47 | ``` 48 | 49 | [⬅ back to list](https://viki.deno.dev/) 50 | -------------------------------------------------------------------------------- /functions/baike/services/fetchItemList.ts: -------------------------------------------------------------------------------- 1 | import { ensureLink } from '../utils/ensureLink.ts' 2 | import { ensureTitle } from '../utils/ensureTitle.ts' 3 | import { fetchItemLink } from '../utils/fetchItemLink.ts' 4 | import { responseWithBaseRes } from '../utils/responseWithBaseRes.ts' 5 | 6 | interface MeaningItem { 7 | title: string 8 | link: string 9 | } 10 | 11 | interface BaikeItem { 12 | item: string 13 | list: MeaningItem[] 14 | } 15 | 16 | const titleReg = /og:title" content="(.*)"/ 17 | const itemReg = /class="item">(.*)(.*)() 22 | 23 | export const getItemList = async (inputItem: string) => { 24 | if (itemListCache.has(inputItem)) { 25 | return itemListCache.get(inputItem) as BaikeItem 26 | } 27 | 28 | const currentLink = await fetchItemLink(inputItem) 29 | 30 | if (!currentLink) { 31 | return null 32 | } 33 | 34 | const html = await (await fetch(currentLink)).text() 35 | const item = titleReg.exec(html)?.[1]?.split('_')[0] ?? '' 36 | 37 | const matches = Array.from(html.matchAll(itemReg)).filter((e) => !!e) 38 | 39 | const items = matches.map((e) => { 40 | const [_, subTitle, link] = itemLinkReg.exec(e[1] || '') ?? [] 41 | 42 | if (!subTitle || !link) { 43 | const currntTitle = itemSelectedReg.exec(e[1])?.[1] ?? '' 44 | return { title: ensureTitle(currntTitle), link: ensureLink(currentLink, true) } 45 | } else { 46 | return { title: ensureTitle(subTitle), link: ensureLink(link, true) } 47 | } 48 | }) 49 | 50 | if (items.length === 0) { 51 | items.unshift({ 52 | title: ensureTitle(item), 53 | link: ensureLink(currentLink, true), 54 | }) 55 | } 56 | 57 | const itemInfo = { item: decodeURIComponent(inputItem), list: items } 58 | 59 | itemListCache.set(inputItem, itemInfo) 60 | 61 | return itemInfo 62 | } 63 | 64 | export const fetchItemList = async (inputItem: string, encoding = 'json') => { 65 | const itemListInfo = await getItemList(inputItem) 66 | 67 | if (!itemListInfo) { 68 | if (encoding === 'text') { 69 | return new Response('词条不存在') 70 | } else { 71 | return responseWithBaseRes({}, 404, '词条不存在') 72 | } 73 | } 74 | 75 | if (encoding === 'text') { 76 | return new Response(itemListInfo.list.map((e, i) => `${i + 1}. ${e.title}`).join('\n')) 77 | } else { 78 | return responseWithBaseRes(itemListInfo) 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /functions/baike/services/fetchTodayInHistory.ts: -------------------------------------------------------------------------------- 1 | import dayjs from 'https://esm.sh/dayjs@1.10.4' 2 | 3 | import { responseWithBaseRes } from '../utils/responseWithBaseRes.ts' 4 | 5 | interface HistoryItem { 6 | title: string 7 | year: string 8 | date: string 9 | desc: string 10 | type: 'birth' | 'death' | 'event' 11 | link: string 12 | } 13 | 14 | type AnyObject = Record 15 | 16 | const eventCache = new Map() 17 | 18 | /** get history api link */ 19 | const getHistoryApi = () => { 20 | const month = new Date().getMonth() + 1 21 | const filename = `${String(month).padStart(2, '0')}.json` 22 | return `https://baike.baidu.com/cms/home/eventsOnHistory/${filename}` 23 | } 24 | 25 | /** remove all html elements and escape NCR (Numeric Character Reference) */ 26 | const transformChars = (text: string) => { 27 | return text.replace(/<.*?>/g, '').replace(/&#(\d+);/g, (_, $1) => String.fromCharCode($1)) 28 | } 29 | 30 | const formatOutput = (items: HistoryItem[] = []) => { 31 | return items.map((e) => `${e.year}年 ${e.title}`).join('\n') 32 | } 33 | 34 | export const fetchTodayInHistory = async (encoding = 'json') => { 35 | const now = dayjs() 36 | const today = now.format(`YYYY/M/D`) 37 | const todayField = now.format('MMDD') 38 | const monthAndDay = now.format('M-D') 39 | 40 | if (eventCache.has(today)) { 41 | if (encoding === 'text') { 42 | return new Response(formatOutput(eventCache.get(today))) 43 | } else { 44 | return responseWithBaseRes(eventCache.get(today)) 45 | } 46 | } 47 | 48 | const res = await fetch(getHistoryApi()) 49 | const monthEvents: AnyObject> = await res.json() 50 | const todayEvents = monthEvents?.[String(now.format('MM'))]?.[todayField] ?? [] 51 | 52 | todayEvents.sort((a, b) => a.year - b.year) 53 | 54 | const modifiedTodayEvents = todayEvents.map((e) => { 55 | let desc = transformChars(e.desc as string) 56 | 57 | if (!desc.endsWith('.') && !desc.endsWith('。')) desc += '...' 58 | 59 | return { 60 | title: transformChars(e.title as string), 61 | year: e.year as string, 62 | date: monthAndDay, 63 | desc: desc, 64 | type: e.type as 'birth' | 'death' | 'event', 65 | link: e.link as string, 66 | } 67 | }) 68 | 69 | eventCache.set(today, modifiedTodayEvents) 70 | 71 | if (encoding === 'text') { 72 | return new Response(formatOutput(eventCache.get(today))) 73 | } else { 74 | return responseWithBaseRes(eventCache.get(today)) 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /functions/baike/services/fetchItem.ts: -------------------------------------------------------------------------------- 1 | import { getItemList } from './fetchItemList.ts' 2 | 3 | import { ensureLink } from '../utils/ensureLink.ts' 4 | import { ensureTitle } from '../utils/ensureTitle.ts' 5 | import { fetchItemLink } from '../utils/fetchItemLink.ts' 6 | import { responseWithBaseRes } from '../utils/responseWithBaseRes.ts' 7 | 8 | interface BaikeItem { 9 | itemName: string 10 | cover: string 11 | description: string 12 | updateTime: string 13 | link: string 14 | } 15 | 16 | const itemCache = new Map() 17 | 18 | const Regs = [ 19 | /og:title" content="([^\"]+)"/, 20 | /og:image" content="([^\"]+)"/, 21 | /og:description" content="([^\"]+)"/, 22 | /og:url" content="([^\"]+)"/, 23 | /dateUpdate" content="([^\"]+)"/, 24 | ] 25 | 26 | export const fetchItem = async (item: string, n: string | null, encoding = 'json') => { 27 | if (itemCache.has(`${item}-${n}`)) { 28 | const itemInfo = itemCache.get(`${item}-${n}`) 29 | 30 | if (encoding === 'text') { 31 | return new Response(itemInfo?.description) 32 | } else { 33 | return responseWithBaseRes(itemInfo) 34 | } 35 | } 36 | 37 | let link = '' 38 | 39 | if (!n) { 40 | link = await fetchItemLink(item) 41 | 42 | if (!link) { 43 | if (encoding === 'text') { 44 | return new Response('词条不存在') 45 | } else { 46 | return responseWithBaseRes({}, 404, '词条不存在') 47 | } 48 | } 49 | } else { 50 | const linkListInfo = await getItemList(item) 51 | 52 | if (!linkListInfo) { 53 | if (encoding === 'text') { 54 | return new Response('词条不存在') 55 | } else { 56 | return responseWithBaseRes({}, 404, '词条不存在') 57 | } 58 | } 59 | 60 | if (!/^\d+$/.test(n)) { 61 | if (encoding === 'text') { 62 | return new Response('n 必须为正整数') 63 | } else { 64 | return responseWithBaseRes({}, 400, 'n 必须为正整数') 65 | } 66 | } 67 | 68 | const size = linkListInfo.list.length 69 | 70 | if (Number(n) > size || Number(n) < 0) { 71 | if (encoding === 'text') { 72 | return new Response('n 越界') 73 | } else { 74 | return responseWithBaseRes({}, 400, 'n 越界') 75 | } 76 | } 77 | 78 | link = linkListInfo.list[Number(n) - 1].link 79 | } 80 | 81 | const html = await (await fetch(link)).text() 82 | 83 | const [itemName, img, desc, url, date] = Regs.map((e) => e.exec(html)?.[1] ?? '') 84 | 85 | const itemInfo = { 86 | itemName: ensureTitle(itemName), 87 | description: desc, 88 | cover: img.split('-')[0], 89 | link: ensureLink(url, true), 90 | updateTime: date, 91 | } 92 | 93 | itemCache.set(`${item}-${n || 0}`, itemInfo) 94 | 95 | if (encoding === 'text') { 96 | return new Response(itemInfo.description) 97 | } else { 98 | return responseWithBaseRes(itemInfo) 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /functions/markdown2html/md2html.ts: -------------------------------------------------------------------------------- 1 | import { CSS, render } from 'jsr:@deno/gfm@0.8.0' 2 | 3 | import 'https://esm.sh/prismjs@1.29.0/components/prism-bash?no-check' 4 | import 'https://esm.sh/prismjs@1.29.0/components/prism-c?no-check' 5 | import 'https://esm.sh/prismjs@1.29.0/components/prism-cpp?no-check' 6 | import 'https://esm.sh/prismjs@1.29.0/components/prism-csharp?no-check' 7 | import 'https://esm.sh/prismjs@1.29.0/components/prism-css?no-check' 8 | import 'https://esm.sh/prismjs@1.29.0/components/prism-dart?no-check' 9 | import 'https://esm.sh/prismjs@1.29.0/components/prism-diff?no-check' 10 | import 'https://esm.sh/prismjs@1.29.0/components/prism-docker?no-check' 11 | import 'https://esm.sh/prismjs@1.29.0/components/prism-git?no-check' 12 | import 'https://esm.sh/prismjs@1.29.0/components/prism-go?no-check' 13 | import 'https://esm.sh/prismjs@1.29.0/components/prism-http?no-check' 14 | import 'https://esm.sh/prismjs@1.29.0/components/prism-ignore?no-check' 15 | import 'https://esm.sh/prismjs@1.29.0/components/prism-ini?no-check' 16 | import 'https://esm.sh/prismjs@1.29.0/components/prism-java?no-check' 17 | import 'https://esm.sh/prismjs@1.29.0/components/prism-javascript?no-check' 18 | import 'https://esm.sh/prismjs@1.29.0/components/prism-json?no-check' 19 | import 'https://esm.sh/prismjs@1.29.0/components/prism-jsx?no-check' 20 | import 'https://esm.sh/prismjs@1.29.0/components/prism-kotlin?no-check' 21 | import 'https://esm.sh/prismjs@1.29.0/components/prism-less?no-check' 22 | import 'https://esm.sh/prismjs@1.29.0/components/prism-nginx?no-check' 23 | import 'https://esm.sh/prismjs@1.29.0/components/prism-python?no-check' 24 | import 'https://esm.sh/prismjs@1.29.0/components/prism-rust?no-check' 25 | import 'https://esm.sh/prismjs@1.29.0/components/prism-sass?no-check' 26 | import 'https://esm.sh/prismjs@1.29.0/components/prism-scala?no-check' 27 | import 'https://esm.sh/prismjs@1.29.0/components/prism-scss?no-check' 28 | import 'https://esm.sh/prismjs@1.29.0/components/prism-sql?no-check' 29 | import 'https://esm.sh/prismjs@1.29.0/components/prism-toml?no-check' 30 | import 'https://esm.sh/prismjs@1.29.0/components/prism-tsx?no-check' 31 | import 'https://esm.sh/prismjs@1.29.0/components/prism-typescript?no-check' 32 | import 'https://esm.sh/prismjs@1.29.0/components/prism-yaml?no-check' 33 | import 'https://esm.sh/prismjs@1.29.0/components/prism-zig?no-check' 34 | 35 | const dirname = new URL(import.meta.url).pathname.split('/').slice(0, -1).join('/') 36 | const gfmCSS = Deno.readTextFileSync(`${dirname}/css/gfm.css`) 37 | 38 | export const md2html = (md: string, pageTitle = '') => { 39 | const title = md.match(/^#+ (.+)\n?/g)?.[0].slice(2) || pageTitle 40 | const body = render(md, { allowMath: true }) 41 | 42 | const html = ` 43 | 44 | 45 | 46 | 47 | 48 | ${title} 49 | 62 | 63 | 64 |
65 | ${body} 66 |
67 | 68 | 69 | ` 70 | return html 71 | } 72 | -------------------------------------------------------------------------------- /functions/markdown2html/README.md: -------------------------------------------------------------------------------- 1 | # Markdown (GFM) to HTML API 2 | 3 | [![github-label](https://img.shields.io/badge/gitub-000000?style=for-the-badge&logo=github)](https://github.com/vikiboss/deno-functions/tree/main/functions/markdown2html) 4 | 5 | Transform `Markdown` (GFM) into pretty `HTML` string, [click here to preview full features](#markdown-render-preview). 6 | 7 | ## Usage 8 | 9 | Just send a `POST` request to the API with the markdown content in the body. 10 | 11 | ### Node.js 12 | 13 | ```ts 14 | const api = 'https://md2html.viki.moe' 15 | 16 | // or use the deno deploy domain 17 | // const api = 'https://markdown2html.deno.dev' 18 | 19 | const markdownContent = `# Hello world 20 | ## H2 21 | ### H3` 22 | 23 | const res = await fetch(api, { 24 | method: 'POST', 25 | body: markdownContent, 26 | }) 27 | 28 | const htmlString = await res.text() 29 | 30 | console.log(htmlString) 31 | ``` 32 | 33 | ### Python 34 | 35 | ```python 36 | import requests 37 | 38 | api = 'https://md2html.viki.moe' 39 | 40 | # or use the deno deploy domain 41 | # api = 'https://markdown2html.deno.dev' 42 | 43 | markdown_content = '''# Hello world 44 | ## H2 45 | ### H3''' 46 | 47 | res = requests.post(api, data=markdown_content) 48 | 49 | html_string = res.text 50 | 51 | print(html_string) 52 | ``` 53 | 54 | ## Languages supporting syntax highlighting 55 | 56 | `bash`, `c`, `cpp`, `csharp`, `css`, `dart`, `diff`, `docker`, `git`, `go`, `http`, `ignore`, `ini`, `java`, `javascript`, `json`, `jsx`, `kotlin`, `less`, `nginx`, `python`, `rust`, `sass`, `scss`, `sql`, `toml`, `tsx`, `typescript`, `yaml`, `zig` 57 | 58 | [⬅ back to API list](https://viki.deno.dev/) 59 | 60 | --- 61 | 62 | # Markdown Render Preview 63 | 64 | # Heading 1 65 | 66 | Main content. **Bold** *Italic* [Link](https://example.com) `Code` 67 | 68 | ![Image](https://blog.viki.moe/favicon.ico) 69 | 70 | ## Heading 2 71 | 72 | ### Heading 3 with Custom Anchor Id {#custom-id} 73 | 74 | #### Heading 4 75 | 76 | ##### Heading 5 77 | 78 | ###### Heading 6 79 | 80 | ## Task List 81 | 82 | - [x] Task 1 83 | - [ ] Task 2 84 | - [ ] Task 3 85 | 86 | ## Table 87 | 88 | ### Normal Table 89 | 90 | | Header 1 | Header 2 | 91 | | -------- | -------- | 92 | | Cell 1 | Cell 2 | 93 | | Cell 3 | Cell 4 | 94 | 95 | ### Align Table 96 | 97 | | Header 1 | Header 2 | Header 3 | 98 | | :------: | :------: | :------: | 99 | | Center | Center | Center | 100 | | Cell 1 | Cell 2 | Cell 3 | 101 | 102 | ## Autolink 103 | 104 | Plain URL text: `https://example.com` => https://example.com 105 | 106 | ## Math 107 | 108 | Block math: 109 | 110 | $$ y = x^2 $$ 111 | 112 | Inline math: $y = x^2$ 113 | 114 | 115 | ## GitHub Styled Alert 116 | 117 | > [!NOTE] 118 | > Highlights information that users should take into account, even when skimming. 119 | 120 | > [!TIP] 121 | > Optional information to help a user be more successful. 122 | 123 | > [!IMPORTANT] 124 | > Crucial information necessary for users to succeed. 125 | 126 | > [!WARNING] 127 | > Critical content demanding immediate user attention due to potential risks. 128 | 129 | > [!CAUTION] 130 | > Negative potential consequences of an action. 131 | 132 | ## Code Block 133 | 134 | ```tsx 135 | import { useState } from 'react'; 136 | 137 | export function App() { 138 | const [count, setCount] = useState(0); 139 | 140 | return ( 141 |
142 |

You clicked {count} times

143 | 144 |
145 | ); 146 | } 147 | ``` 148 | 149 | ```rust 150 | fn main() { 151 | println!("Hello, world!"); 152 | } 153 | ``` 154 | 155 | ```python 156 | def hello(): 157 | print('Hello World') 158 | ``` 159 | 160 | ```javascript 161 | console.log('Hello World'); 162 | ``` 163 | 164 | ```json 165 | { 166 | "name": "Vikash", 167 | "age": 25 168 | } 169 | ``` 170 | 171 | ```diff 172 | +const a = 1; 173 | -const b = 2; 174 | ``` 175 | 176 | ## Limited HTML Tags Support 177 | 178 |
179 | Click to expand! 180 | Content inside details 181 |
182 | 183 | Avatar 184 | 185 |
186 | Tomato Text 187 | Lime Text 188 | Skyblue Text 189 |
190 | 191 | ## Footnote 192 | 193 | This is a footnote[^1]. 194 | 195 | [^1]: Footnote Content 196 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4", 3 | "specifiers": { 4 | "jsr:@deno/gfm@0.10.0": "0.10.0", 5 | "jsr:@deno/gfm@0.6.0": "0.6.0", 6 | "jsr:@deno/gfm@0.8.0": "0.8.0", 7 | "jsr:@deno/gfm@0.9.0": "0.9.0", 8 | "jsr:@denosaurs/emoji@0.3": "0.3.1", 9 | "npm:@types/node@*": "22.5.4", 10 | "npm:github-slugger@2": "2.0.0", 11 | "npm:he@^1.2.0": "1.2.0", 12 | "npm:katex@0.16": "0.16.21", 13 | "npm:marked-alert@2": "2.1.2_marked@12.0.2", 14 | "npm:marked-footnote@^1.2.0": "1.2.4_marked@12.0.2", 15 | "npm:marked-gfm-heading-id@^3.1.0": "3.2.0_marked@12.0.2", 16 | "npm:marked@12": "12.0.2", 17 | "npm:marked@^11.1.0": "11.2.0", 18 | "npm:prismjs@^1.29.0": "1.29.0", 19 | "npm:sanitize-html@^2.11.0": "2.14.0", 20 | "npm:sanitize-html@^2.13.0": "2.14.0" 21 | }, 22 | "jsr": { 23 | "@deno/gfm@0.6.0": { 24 | "integrity": "e536de096af34e3c497b96b701aa6f2be48fa1b0b5d12f8c0ffdca8ad663a11b", 25 | "dependencies": [ 26 | "npm:github-slugger", 27 | "npm:he", 28 | "npm:katex", 29 | "npm:marked-alert", 30 | "npm:marked-footnote", 31 | "npm:marked-gfm-heading-id", 32 | "npm:marked@^11.1.0", 33 | "npm:prismjs", 34 | "npm:sanitize-html@^2.11.0" 35 | ] 36 | }, 37 | "@deno/gfm@0.8.0": { 38 | "integrity": "c4cec6b457e7ef8d826e5efbd2ffee7d5a2a29cf4e2fa5da9fbda180442f2847", 39 | "dependencies": [ 40 | "jsr:@denosaurs/emoji", 41 | "npm:github-slugger", 42 | "npm:he", 43 | "npm:katex", 44 | "npm:marked-alert", 45 | "npm:marked-footnote", 46 | "npm:marked-gfm-heading-id", 47 | "npm:marked@^11.1.0", 48 | "npm:prismjs", 49 | "npm:sanitize-html@^2.11.0" 50 | ] 51 | }, 52 | "@deno/gfm@0.9.0": { 53 | "integrity": "9002dbdb6e382e247509edfeae3afdb9232f5ca98a8210ef186d42084e9ded30", 54 | "dependencies": [ 55 | "jsr:@denosaurs/emoji", 56 | "npm:github-slugger", 57 | "npm:he", 58 | "npm:katex", 59 | "npm:marked-alert", 60 | "npm:marked-footnote", 61 | "npm:marked-gfm-heading-id", 62 | "npm:marked@12", 63 | "npm:prismjs", 64 | "npm:sanitize-html@^2.11.0" 65 | ] 66 | }, 67 | "@deno/gfm@0.10.0": { 68 | "integrity": "51708205e3559a4aeb6afb29d07c5bfafe7941f91bb360351ef6621de9a39527", 69 | "dependencies": [ 70 | "jsr:@denosaurs/emoji", 71 | "npm:github-slugger", 72 | "npm:he", 73 | "npm:katex", 74 | "npm:marked-alert", 75 | "npm:marked-footnote", 76 | "npm:marked-gfm-heading-id", 77 | "npm:marked@12", 78 | "npm:prismjs", 79 | "npm:sanitize-html@^2.13.0" 80 | ] 81 | }, 82 | "@denosaurs/emoji@0.3.1": { 83 | "integrity": "b0aed5f55dec99e83da7c9637fe0a36d1d6252b7c99deaaa3fc5dea3fcf3da8b" 84 | } 85 | }, 86 | "npm": { 87 | "@types/node@22.5.4": { 88 | "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", 89 | "dependencies": [ 90 | "undici-types" 91 | ] 92 | }, 93 | "commander@8.3.0": { 94 | "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" 95 | }, 96 | "deepmerge@4.3.1": { 97 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" 98 | }, 99 | "dom-serializer@2.0.0": { 100 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 101 | "dependencies": [ 102 | "domelementtype", 103 | "domhandler", 104 | "entities" 105 | ] 106 | }, 107 | "domelementtype@2.3.0": { 108 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" 109 | }, 110 | "domhandler@5.0.3": { 111 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 112 | "dependencies": [ 113 | "domelementtype" 114 | ] 115 | }, 116 | "domutils@3.2.2": { 117 | "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 118 | "dependencies": [ 119 | "dom-serializer", 120 | "domelementtype", 121 | "domhandler" 122 | ] 123 | }, 124 | "entities@4.5.0": { 125 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" 126 | }, 127 | "escape-string-regexp@4.0.0": { 128 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 129 | }, 130 | "github-slugger@2.0.0": { 131 | "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" 132 | }, 133 | "he@1.2.0": { 134 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 135 | }, 136 | "htmlparser2@8.0.2": { 137 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 138 | "dependencies": [ 139 | "domelementtype", 140 | "domhandler", 141 | "domutils", 142 | "entities" 143 | ] 144 | }, 145 | "is-plain-object@5.0.0": { 146 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 147 | }, 148 | "katex@0.16.21": { 149 | "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", 150 | "dependencies": [ 151 | "commander" 152 | ] 153 | }, 154 | "marked-alert@2.1.2_marked@12.0.2": { 155 | "integrity": "sha512-EFNRZ08d8L/iEIPLTlQMDjvwIsj03gxWCczYTht6DCiHJIZhMk4NK5gtPY9UqAYb09eV5VGT+jD4lp396E0I+w==", 156 | "dependencies": [ 157 | "marked@12.0.2" 158 | ] 159 | }, 160 | "marked-footnote@1.2.4_marked@12.0.2": { 161 | "integrity": "sha512-DB2Kl+wFh6YwZd70qABMY6WUkG1UuyqoNTFoDfGyG79Pz24neYtLBkB+45a7o72V7gkfvbC3CGzIYFobxfMT1Q==", 162 | "dependencies": [ 163 | "marked@12.0.2" 164 | ] 165 | }, 166 | "marked-gfm-heading-id@3.2.0_marked@12.0.2": { 167 | "integrity": "sha512-Xfxpr5lXLDLY10XqzSCA9l2dDaiabQUgtYM9hw8yunyVsB/xYBRpiic6BOiY/EAJw1ik1eWr1ET1HKOAPZBhXg==", 168 | "dependencies": [ 169 | "github-slugger", 170 | "marked@12.0.2" 171 | ] 172 | }, 173 | "marked@11.2.0": { 174 | "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==" 175 | }, 176 | "marked@12.0.2": { 177 | "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==" 178 | }, 179 | "nanoid@3.3.8": { 180 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==" 181 | }, 182 | "parse-srcset@1.0.2": { 183 | "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" 184 | }, 185 | "picocolors@1.1.1": { 186 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 187 | }, 188 | "postcss@8.5.1": { 189 | "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", 190 | "dependencies": [ 191 | "nanoid", 192 | "picocolors", 193 | "source-map-js" 194 | ] 195 | }, 196 | "prismjs@1.29.0": { 197 | "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" 198 | }, 199 | "sanitize-html@2.14.0": { 200 | "integrity": "sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g==", 201 | "dependencies": [ 202 | "deepmerge", 203 | "escape-string-regexp", 204 | "htmlparser2", 205 | "is-plain-object", 206 | "parse-srcset", 207 | "postcss" 208 | ] 209 | }, 210 | "source-map-js@1.2.1": { 211 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 212 | }, 213 | "undici-types@6.19.8": { 214 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" 215 | } 216 | }, 217 | "redirects": { 218 | "https://esm.sh/@jsr/denosaurs__emoji@^0.3?target=denonext": "https://esm.sh/jsr/@denosaurs/emoji@0.3.1?target=denonext", 219 | "https://esm.sh/@types/he@~1.2.3/index.d.ts": "https://esm.sh/@types/he@1.2.3/index.d.ts", 220 | "https://esm.sh/@types/parse-srcset@~1.0.0/index.d.ts": "https://esm.sh/@types/parse-srcset@1.0.0/index.d.ts", 221 | "https://esm.sh/@types/prismjs@~1.26.5/index.d.ts": "https://esm.sh/@types/prismjs@1.26.5/index.d.ts", 222 | "https://esm.sh/@types/sanitize-html@~2.13.0/index.d.ts": "https://esm.sh/@types/sanitize-html@2.13.0/index.d.ts", 223 | "https://esm.sh/deepmerge@^4.2.2?target=denonext": "https://esm.sh/deepmerge@4.3.1?target=denonext", 224 | "https://esm.sh/dom-serializer@^2.0.0?target=denonext": "https://esm.sh/dom-serializer@2.0.0?target=denonext", 225 | "https://esm.sh/domelementtype@^2.3.0?target=denonext": "https://esm.sh/domelementtype@2.3.0?target=denonext", 226 | "https://esm.sh/domhandler@^5.0.3?target=denonext": "https://esm.sh/domhandler@5.0.3?target=denonext", 227 | "https://esm.sh/domutils@^3.0.1?target=denonext": "https://esm.sh/domutils@3.2.2?target=denonext", 228 | "https://esm.sh/entities@^4.2.0?target=denonext": "https://esm.sh/entities@4.5.0?target=denonext", 229 | "https://esm.sh/entities@^4.4.0/lib/decode?target=denonext": "https://esm.sh/entities@4.5.0/lib/decode?target=denonext", 230 | "https://esm.sh/escape-string-regexp@^4.0.0?target=denonext": "https://esm.sh/escape-string-regexp@4.0.0?target=denonext", 231 | "https://esm.sh/github-slugger@^2.0.0?target=denonext": "https://esm.sh/github-slugger@2.0.0?target=denonext", 232 | "https://esm.sh/github-slugger@^2.0?target=denonext": "https://esm.sh/github-slugger@2.0.0?target=denonext", 233 | "https://esm.sh/he@^1.2?target=denonext": "https://esm.sh/he@1.2.0?target=denonext", 234 | "https://esm.sh/htmlparser2@^8.0.0?target=denonext": "https://esm.sh/htmlparser2@8.0.2?target=denonext", 235 | "https://esm.sh/katex@^0.16?target=denonext": "https://esm.sh/katex@0.16.21?target=denonext", 236 | "https://esm.sh/marked-alert@^2.0?target=denonext": "https://esm.sh/marked-alert@2.1.2?target=denonext", 237 | "https://esm.sh/marked-footnote@^1.2?target=denonext": "https://esm.sh/marked-footnote@1.2.4?target=denonext", 238 | "https://esm.sh/marked-gfm-heading-id@^3.1?target=denonext": "https://esm.sh/marked-gfm-heading-id@3.2.0?target=denonext", 239 | "https://esm.sh/marked@^12?target=denonext": "https://esm.sh/marked@12.0.2?target=denonext", 240 | "https://esm.sh/nanoid@^3.3.8/non-secure?target=denonext": "https://esm.sh/nanoid@3.3.8/non-secure?target=denonext", 241 | "https://esm.sh/parse-srcset@^1.0.2?target=denonext": "https://esm.sh/parse-srcset@1.0.2?target=denonext", 242 | "https://esm.sh/picocolors@^1.1.1?target=denonext": "https://esm.sh/picocolors@1.1.1?target=denonext", 243 | "https://esm.sh/postcss@^8.3.11?target=denonext": "https://esm.sh/postcss@8.5.1?target=denonext", 244 | "https://esm.sh/prismjs@^1.29/components/prism-yaml?target=denonext": "https://esm.sh/prismjs@1.29.0/components/prism-yaml?target=denonext", 245 | "https://esm.sh/prismjs@^1.29?target=denonext": "https://esm.sh/prismjs@1.29.0?target=denonext", 246 | "https://esm.sh/sanitize-html@^2.13?target=denonext": "https://esm.sh/sanitize-html@2.14.0?target=denonext", 247 | "https://esm.sh/source-map-js@^1.2.1?target=denonext": "https://esm.sh/source-map-js@1.2.1?target=denonext" 248 | }, 249 | "remote": { 250 | "https://deno.land/std@0.149.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", 251 | "https://deno.land/std@0.149.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", 252 | "https://deno.land/std@0.149.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", 253 | "https://deno.land/std@0.149.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", 254 | "https://deno.land/std@0.149.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", 255 | "https://deno.land/std@0.149.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", 256 | "https://deno.land/std@0.149.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", 257 | "https://deno.land/std@0.149.0/path/mod.ts": "4945b430b759b0b3d98f2a278542cbcf95e0ad2bd8eaaed3c67322b306b2b346", 258 | "https://deno.land/std@0.149.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa", 259 | "https://deno.land/std@0.149.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", 260 | "https://deno.land/std@0.149.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c", 261 | "https://deno.land/x/base64@v0.2.1/base.ts": "47dc8d68f07dc91524bdd6db36eccbe59cf4d935b5fc09f27357a3944bb3ff7b", 262 | "https://deno.land/x/base64@v0.2.1/mod.ts": "1cbdc4ba7229d3c6d1763fecdb9d46844777c7e153abb6dabea8b0dd01448db4", 263 | "https://deno.land/x/qrcode@v2.0.0/mod.ts": "3e693e8190d5fb4c6ab68a14a1a9473c325d5244fd83240b49cdecdf5fc18a1b", 264 | "https://deno.land/x/qrcode@v2.0.0/qrcode.js": "138f870978e21843f48d8b0855b69de6ebf430c3ab9f57c3fa2746d6fba45bf1", 265 | "https://esm.sh/@jsr/deno__gfm@0.10.0": "ab3095804e5b9a9b5040e2ccdb8cd47bf64eb4553e75c6e03371536139b79b4e", 266 | "https://esm.sh/@jsr/deno__gfm@0.10.0/denonext/deno__gfm.mjs": "be5a09a3b3628040ca7902c843cd05d86936d768bde89403dc1a665f80dac48f", 267 | "https://esm.sh/@jsr/deno__gfm@0.10.0/denonext/mod.ts.mjs": "d0f9418929777cb387e21ca82b4749352c3568801213bbfa9f3b4813e9e8498b", 268 | "https://esm.sh/@jsr/deno__gfm@0.10.0/mod.ts": "ff7ecaed9fd79c0ec7d08c9eef038870fad588e128a802e5012d8cb274262216", 269 | "https://esm.sh/@jsr/denosaurs__emoji@0.3.1/denonext/denosaurs__emoji.mjs": "0791d4d3426bac2a29fd5435a370de0ab47430c853fe316e3721e69e0de059aa", 270 | "https://esm.sh/dayjs@1.10.4": "272402c6519b1449e8c8ae587de0acf0328d955ec28c88b33aa5eb1fcfaba462", 271 | "https://esm.sh/dayjs@1.10.4/denonext/dayjs.mjs": "0ee18eeaa4fe6a0a2b687869eae5b1029a245704bc59b44e9f73ce8318009b14", 272 | "https://esm.sh/deepmerge@4.3.1/denonext/deepmerge.mjs": "1f448aaa83a52514faecb2edc02eb766c9eb10b935b9ac4c1c2a877a0bb56b80", 273 | "https://esm.sh/deepmerge@4.3.1?target=denonext": "a8faef33b536441a2c63f8c967d160848eb1f898a8e83a35a9f0623ecd9063d3", 274 | "https://esm.sh/dom-serializer@2.0.0/denonext/dom-serializer.mjs": "545028b1d2c25bae5cbfe6930a28a2e4f7f05e1a0d09bbd0f3f5f9a33df8e3bd", 275 | "https://esm.sh/dom-serializer@2.0.0?target=denonext": "1626b2b8326556ea2816b5f9bf7522bc9581d545fd9ad117c066ab7a5ff1fb89", 276 | "https://esm.sh/domelementtype@2.3.0/denonext/domelementtype.mjs": "4f3b57348729cd517560139eb1969ca2fe9cc58c5188abe56e7336d5cb557cc0", 277 | "https://esm.sh/domelementtype@2.3.0?target=denonext": "2beb2a1e3d18892a9b00ef9528811b93f613a77d2b6fb25376ec0f109ac48a4f", 278 | "https://esm.sh/domhandler@5.0.3/denonext/domhandler.mjs": "3fb258a3d79bc9066a568bb6b09ce946d1fcfa2636a24ae80a4db220956e0873", 279 | "https://esm.sh/domhandler@5.0.3?target=denonext": "298fde249b7bff9e80667cfe643e7d4b390871b77b0928d086ce4c0b8fc570e2", 280 | "https://esm.sh/domutils@3.2.2/denonext/domutils.mjs": "f0b4e80e73810ed6f3d8c4e1822feef89208f32c88b6024a84328d02f5f77c40", 281 | "https://esm.sh/domutils@3.2.2?target=denonext": "7e487176c61dfd1dfdbcfd1195e7329a64f53421511561b69c570a6cff0a6167", 282 | "https://esm.sh/entities@4.5.0/denonext/entities.mjs": "4a9306e4021ae1079e83b5db26e1678c536fa69c8f2839802bc3cc43282cef08", 283 | "https://esm.sh/entities@4.5.0/denonext/lib/decode.mjs": "ef22e25f6bca668e40c4f7d4ecaebe2172a833a18372d55b54f997d0d8702dcd", 284 | "https://esm.sh/entities@4.5.0/denonext/lib/escape.mjs": "116aef78e5ff05efa6f79851b8b59da025ab88f5c25d2262f73df98f4d57c3fa", 285 | "https://esm.sh/entities@4.5.0/lib/decode?target=denonext": "488bc8401a0c85a76527d61a41352c5371904aeda57a136eb10ccfadcd2f7c8c", 286 | "https://esm.sh/entities@4.5.0?target=denonext": "f6bc559c07f40e94b3ef50f0b24e2666a2258db3b6697bf4da8fd2fc014ef7a1", 287 | "https://esm.sh/escape-string-regexp@4.0.0/denonext/escape-string-regexp.mjs": "8b9ba1b04d86262e578b7ed6f847ab744d87f8c6fdc93d0ce4814066346f253c", 288 | "https://esm.sh/escape-string-regexp@4.0.0?target=denonext": "773f8560c5504d7a3d2ace5dcf985473388172a407673060a1a106d1fe10076e", 289 | "https://esm.sh/github-slugger@2.0.0/denonext/github-slugger.mjs": "8a2344aa76877552fbf3a155b45155c9fada7c3382260630d501ad21d4e4f706", 290 | "https://esm.sh/github-slugger@2.0.0?target=denonext": "d28cd7ca6c92db767c7d05e906b7cff215b9b90392306566e33a7763b1bbec33", 291 | "https://esm.sh/he@1.2.0/denonext/he.mjs": "909418f242c58b64c65b0f18e3107395a3279a80c5521f0fc6551dbbe140ed14", 292 | "https://esm.sh/he@1.2.0?target=denonext": "bc304782debd103009d8ad8554a39142d747ad2bc3e41dd4925879611f5fd0dd", 293 | "https://esm.sh/htmlparser2@8.0.2/denonext/htmlparser2.mjs": "c0be0f190e625b82e88378875016f820a38d586e9c885d37e3dd2073a4f0fdfb", 294 | "https://esm.sh/htmlparser2@8.0.2/denonext/lib/esm/Parser.mjs": "d58fb2f87f8fead8e7ac03c544690908b4db21ab0513415b0cfe9311ab31aaa3", 295 | "https://esm.sh/htmlparser2@8.0.2/denonext/lib/esm/Tokenizer.mjs": "09109e601c7acd75b99c2a34e53e339a46301d9937e1495eaca8f9019a7b3040", 296 | "https://esm.sh/htmlparser2@8.0.2?target=denonext": "fd3edaa58a00e79f11b3510cc3930c9f5345486cdcc52c0afe24bbb36aece028", 297 | "https://esm.sh/jsr/@denosaurs/emoji@0.3.1?target=denonext": "9d9536a444f0164d81eadafd05373c68d928bc6b849edf2c0951abd49d22efa0", 298 | "https://esm.sh/katex@0.16.21/denonext/katex.mjs": "daa0d2653aebdf1289d3007abbb65a1b230f25cb71a5c9903371275aab104306", 299 | "https://esm.sh/katex@0.16.21?target=denonext": "9fa04bc7144b202550466cc47f5d77d03fbeba51f9e375c1758e63c3e328256a", 300 | "https://esm.sh/marked-alert@2.1.2/denonext/marked-alert.mjs": "76fa208a820437f46db82664eb170c76f0e3109f4ff7584e6148d0ddfd66c362", 301 | "https://esm.sh/marked-alert@2.1.2?target=denonext": "85d66a5d61f44d5b8beefd34ddc25615f2664eed9b7ef4e863432e82e3125df1", 302 | "https://esm.sh/marked-footnote@1.2.4/denonext/marked-footnote.mjs": "9bb7dedc5a8ee309966d8d0a4bb59d92266a8d1401bdc9eb6868268b539d0d16", 303 | "https://esm.sh/marked-footnote@1.2.4?target=denonext": "a6035295252ee9b36056b8fe33f2b9414618a1630e5f8fc0920ca68be633bc6a", 304 | "https://esm.sh/marked-gfm-heading-id@3.2.0/denonext/marked-gfm-heading-id.mjs": "57a88b13f9ecef7db11f72426f6db6d73b758aabfd67d03c6e91ce342e866304", 305 | "https://esm.sh/marked-gfm-heading-id@3.2.0?target=denonext": "866b70ef02106a92f84bc64c59a5a1b273e2627dd3fdff3582e0c704ed512428", 306 | "https://esm.sh/marked@12.0.2/denonext/marked.mjs": "7d1c6d592f4403894f962ff5c22a94345179d5746b0bd309de13536b43fca1de", 307 | "https://esm.sh/marked@12.0.2?target=denonext": "8dea80a91c5e1722780d4056614fb6f7f8fb57da746e876ee0abac4f79761457", 308 | "https://esm.sh/nanoid@3.3.8/denonext/non-secure.mjs": "fddf4ab6510fe8b600cfa3fa6a38b05e275757135a156142d470fc7e544a600f", 309 | "https://esm.sh/nanoid@3.3.8/non-secure?target=denonext": "2c3c59d8330ed3c0444aebb4611325a49feec485e1e2c34af6971ead1d10e7d9", 310 | "https://esm.sh/parse-srcset@1.0.2/denonext/parse-srcset.mjs": "eaed6b50e95f4be186d52d09bdf27fc7f2cbdd18c300558b11e189db53e32c44", 311 | "https://esm.sh/parse-srcset@1.0.2?target=denonext": "5a5bb01aad672c419745d58be9f946481eb0458365a612725eb33761068036af", 312 | "https://esm.sh/picocolors@1.1.1/denonext/picocolors.mjs": "fa0033734392d8b8ad0c565338a77fa835e8b00e9ef244bf6f36570dd699ea3f", 313 | "https://esm.sh/picocolors@1.1.1?target=denonext": "97aaf037b1af74a20fe9f9f2beabba700924823101e86bdcd3ae2c9327376f74", 314 | "https://esm.sh/postcss@8.5.1/denonext/lib/at-rule.mjs": "19ba20f24357e482d62d0279062ba9ec06e4f025ab5fd81e329155d691c6e032", 315 | "https://esm.sh/postcss@8.5.1/denonext/lib/comment.mjs": "38b12989cac10c0e7382499b8a86b05162f6b9f2c1539a2a2ad529c852c5db90", 316 | "https://esm.sh/postcss@8.5.1/denonext/lib/container.mjs": "97e60be226e040e09bb4ca84aa062d06e75ac41b445fad37716596b16ecaba2d", 317 | "https://esm.sh/postcss@8.5.1/denonext/lib/css-syntax-error.mjs": "3dcd0105ba5257a0f6699f16157131736208a21d33c57ba84cfaf2994aab6e9e", 318 | "https://esm.sh/postcss@8.5.1/denonext/lib/declaration.mjs": "b3edc67e5b8872bc09efb20acc50f18298d3eef50761221d600f75992ba4515f", 319 | "https://esm.sh/postcss@8.5.1/denonext/lib/document.mjs": "7b990eecf6f93ce72d449aaad32ff0b7c3ab8ae50d6e531be0c3f12bb38b6613", 320 | "https://esm.sh/postcss@8.5.1/denonext/lib/fromJSON.mjs": "f10a41062632f5e66bee502b9428216f53e7fb4546079d24e489531fea52db93", 321 | "https://esm.sh/postcss@8.5.1/denonext/lib/input.mjs": "9b172cc2311297e09f6c8068a6a75060425ba0f8126216901d4c1ef895ac6052", 322 | "https://esm.sh/postcss@8.5.1/denonext/lib/lazy-result.mjs": "c7f22d5dfa8acc26aae56e5aa421629406b0d0d4c60f1186c0c57d63b364b5c7", 323 | "https://esm.sh/postcss@8.5.1/denonext/lib/list.mjs": "82a9b83f126b396d91cb6d935e4ff6d23e5b8b8da60da2cb73b8605a45202b3b", 324 | "https://esm.sh/postcss@8.5.1/denonext/lib/map-generator.mjs": "b48f73b34b8ccae25917b555d860a551b64311cc56fd059f2ab033a0ac0006db", 325 | "https://esm.sh/postcss@8.5.1/denonext/lib/no-work-result.mjs": "c65ea37fcf52c0f1ee7bf4de75479bad000b6de8cb4095b625c4a10a1ffb9f52", 326 | "https://esm.sh/postcss@8.5.1/denonext/lib/node.mjs": "7cd8f243ede3753091d5169ab8088d0a3370fcaab8f15ac895416498f1c66695", 327 | "https://esm.sh/postcss@8.5.1/denonext/lib/parse.mjs": "278afe48d435849439e48596d9df0a58c9852058a082c48371a70051e83f07c9", 328 | "https://esm.sh/postcss@8.5.1/denonext/lib/parser.mjs": "bf685e6cd9aa570f6cadf2de939cc69afe8e94f39de0b3a4b25feb76c96644e2", 329 | "https://esm.sh/postcss@8.5.1/denonext/lib/previous-map.mjs": "f7852b0574afe9bdb6e6518b33bd537fc74bd002c0ec64a9366cbf96c64dc8b4", 330 | "https://esm.sh/postcss@8.5.1/denonext/lib/processor.mjs": "5474b063f5d575f2038a56b97442e797064002c5ef1123d5a0b714e9718e622d", 331 | "https://esm.sh/postcss@8.5.1/denonext/lib/result.mjs": "edee7e43a01097007f1c796f5f44e986584bfb062d7570dea3a06fe0200577cd", 332 | "https://esm.sh/postcss@8.5.1/denonext/lib/root.mjs": "4a8d5e1bfc387c4a9e7c807636674375c1cdf5d2626567352ef33abf3fd48194", 333 | "https://esm.sh/postcss@8.5.1/denonext/lib/rule.mjs": "8b24ebd131af6bac3c9ff3fad634ed51add45412ca837fae97acaab685316457", 334 | "https://esm.sh/postcss@8.5.1/denonext/lib/stringifier.mjs": "43f231b376bb8d0fc03fbae4c3d2d624394ddcd8d348ebdadd32ff0b42edf9cc", 335 | "https://esm.sh/postcss@8.5.1/denonext/lib/stringify.mjs": "42b910ad8cdea468584a653a2101b88cbc93762f764c32880ea1ae185d012626", 336 | "https://esm.sh/postcss@8.5.1/denonext/lib/symbols.mjs": "192e7e34207d9c3c52506d624aad035c97438d651559360665d4e4c268c7b898", 337 | "https://esm.sh/postcss@8.5.1/denonext/lib/terminal-highlight.mjs": "dbf59147b6129d14abcb8fa98949da0749d7ef83c7ac64c6fa273fd3a31823a0", 338 | "https://esm.sh/postcss@8.5.1/denonext/lib/tokenize.mjs": "e1e5706cc284b566998abea9bf4495ef6319f9c19e423d831e9d55f17436ae47", 339 | "https://esm.sh/postcss@8.5.1/denonext/lib/warn-once.mjs": "5064912f57d7cafd68c6f6ed9e6f7af9348359aae5c6dce4852de6e7e28c08cb", 340 | "https://esm.sh/postcss@8.5.1/denonext/lib/warning.mjs": "ccd00e6f21c2b1ac713c19e8f24a0fe8ecce21fb355025e3a7d5a2c98efe4613", 341 | "https://esm.sh/postcss@8.5.1/denonext/postcss.mjs": "d25def962994060d9337d9483202d26c10635df2885cd72c4fc7ed5141590d7f", 342 | "https://esm.sh/postcss@8.5.1?target=denonext": "4e13d6c4e82f5dcf690dd7f7776af814747d62feeac4f20ab6e73a9426371453", 343 | "https://esm.sh/prismjs@1.29.0/components/prism-bash?no-check": "3b9e13a7c4d6c4f003ed7cc5035c567aef39720dc31c2ae147d05764ecbd399d", 344 | "https://esm.sh/prismjs@1.29.0/components/prism-c?no-check": "d35163060a777c83e472115be512d2694776d37c864e7ade9202e756187d3b7b", 345 | "https://esm.sh/prismjs@1.29.0/components/prism-cpp?no-check": "8d4a256e96c31e2f2a69bf9be63d3f78606c6dbec59828a678e0c695cccc864d", 346 | "https://esm.sh/prismjs@1.29.0/components/prism-csharp?no-check": "53929bb0be84b0354d59aa2392feabd4e4321c8ab88199b0562da12205c619c0", 347 | "https://esm.sh/prismjs@1.29.0/components/prism-css?no-check": "7d2395e73c366bf5d364a4d9b5097b84518e6698969532485c8ad14862944471", 348 | "https://esm.sh/prismjs@1.29.0/components/prism-dart?no-check": "37ec8d34eedf3e3f2b5cce5a4ca523b7935536902354b0d257e2e134f0b624f7", 349 | "https://esm.sh/prismjs@1.29.0/components/prism-diff?no-check": "c956fde10da291ec1c269dc97a47d34802273a3cd5c56312ff30da0f479f9ca9", 350 | "https://esm.sh/prismjs@1.29.0/components/prism-docker?no-check": "80ddd79d26fe399a754f70dbb7b1949d637f3d4947a3894ae0dff2df5d9dbc1e", 351 | "https://esm.sh/prismjs@1.29.0/components/prism-git?no-check": "fbdd4e10aaaf3b564d5fdb872e3f539892ac8b021cdd6dd331ec1183076bd58a", 352 | "https://esm.sh/prismjs@1.29.0/components/prism-go?no-check": "5f7a66f263416df120b0041a8c25cdf0a2ea48c250793badd53f8af66054f21e", 353 | "https://esm.sh/prismjs@1.29.0/components/prism-http?no-check": "797a8cbd282e355b51de5c35a6641dade69216fad819d386352eef83185c9fbe", 354 | "https://esm.sh/prismjs@1.29.0/components/prism-ignore?no-check": "5b6edbe7fc287e7495d313d80ee3346499902729ddf71fb268e3ccb27ead2bba", 355 | "https://esm.sh/prismjs@1.29.0/components/prism-ini?no-check": "24bdfba12845080b269d022120e0ccd44eabb68bcca757df0d5b1fd4b27d96db", 356 | "https://esm.sh/prismjs@1.29.0/components/prism-java?no-check": "e834ac2331144f38e933e4e5498fe0288986857c0e6991466799e737cb1567d8", 357 | "https://esm.sh/prismjs@1.29.0/components/prism-javascript?no-check": "7023e136954b90726641d1eb0baab3f901df24ee2754db9519d455fe4d7d8959", 358 | "https://esm.sh/prismjs@1.29.0/components/prism-json?no-check": "93d8a48ff5714926403fbfd3a1380a39deac4792fb19560b737c1f823e4eec97", 359 | "https://esm.sh/prismjs@1.29.0/components/prism-jsx?no-check": "4b63c1600f1e5e8bcd3b914e7f40f38919e802f2590521e3387e16750a42ac39", 360 | "https://esm.sh/prismjs@1.29.0/components/prism-kotlin?no-check": "df5cc16817787b011ef6cbc2362c956daf012367aca54cebb346a9398bd81b82", 361 | "https://esm.sh/prismjs@1.29.0/components/prism-less?no-check": "d9aefcc391cb0d6f6b2eaea2338e64a871a76ad5c737d2fbb15a59b7cb2870d4", 362 | "https://esm.sh/prismjs@1.29.0/components/prism-nginx?no-check": "3bb1bd2136fd9c8a2a4b19d91c0518117f2a4cd2245f345e0c4044ae42c06cc9", 363 | "https://esm.sh/prismjs@1.29.0/components/prism-python?no-check": "92ec8e9563798481f4d376b47d0faf18c33ae7d4c779ea7abc150ccab585490f", 364 | "https://esm.sh/prismjs@1.29.0/components/prism-rust?no-check": "a6814240355908451418cf6c9a6a1a35dd471ec67424b907516ad78ccd1bb567", 365 | "https://esm.sh/prismjs@1.29.0/components/prism-sass?no-check": "9c06b8d8acd10e083141855a73eea41ba01e93d9aea25a14426c33aa1c96a3b7", 366 | "https://esm.sh/prismjs@1.29.0/components/prism-scala?no-check": "3538ebcafbf5cf0a53ac956423af0e8e2650dc699f2ddfcc3778ddf1a15a78de", 367 | "https://esm.sh/prismjs@1.29.0/components/prism-scss?no-check": "5f9e93c2af2a325151ffe5efc3aab3829efdcddede453b102dd734fce27f60b4", 368 | "https://esm.sh/prismjs@1.29.0/components/prism-sql?no-check": "6ebeae87f37662d5197dd3a173da61991a8c0cf692a39c3e0d2a225304a836e1", 369 | "https://esm.sh/prismjs@1.29.0/components/prism-toml?no-check": "e71c36b426f4d54aedb4237fab8d8b6116b4a8571bfcb34366af8507315014f7", 370 | "https://esm.sh/prismjs@1.29.0/components/prism-tsx?no-check": "9fc047f0773d77546a98e04ce5fcb4995292f7c264af8c131d8850c614457871", 371 | "https://esm.sh/prismjs@1.29.0/components/prism-typescript?no-check": "999460db7802459f03c85134349b772f061e1be9f401a81b708b65c6061b6d9a", 372 | "https://esm.sh/prismjs@1.29.0/components/prism-yaml?no-check": "9f6550a4159958d5e65f9ad58de4827cb6b47fd83a33ea309b65ce406aba4a0e", 373 | "https://esm.sh/prismjs@1.29.0/components/prism-yaml?target=denonext": "9f6550a4159958d5e65f9ad58de4827cb6b47fd83a33ea309b65ce406aba4a0e", 374 | "https://esm.sh/prismjs@1.29.0/components/prism-zig?no-check": "1c07e9b44a04037ec27e65c31b076a25a6747f7d722e8fb9d189306b9db73646", 375 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-bash.mjs": "53de140b7f10e7b06387d3e8734487311c839ace770b0a25a1d3d68ee420738b", 376 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-c.mjs": "cd4bae2fb9ff9a3ac410d75e2c671755fe95c9e9366c69405e72e61f382d5206", 377 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-cpp.mjs": "56f7f6fcb8d3892db06c8e827d7f7d88f70963ee425cd9a8877d44a104ad27d3", 378 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-csharp.mjs": "6ff48d8d50d66d9b8d2801992a4efe8c85c861e100788ad253425686e40c98a8", 379 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-css.mjs": "ec2c5f1ccf25533b409f86330c50fc0f94c6ad2b9a30999c3fb50eef64cc0595", 380 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-dart.mjs": "89734bc1063d8f034f67d40c8a05e1a49c2c5601d8d7b19dfbdd11a4765f173a", 381 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-diff.mjs": "20027580bc5c098a66593b6b4cebed688db6c92e351c81c343ac8e37afa74134", 382 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-docker.mjs": "2c86b652be34e39884fe8f0325b30e56b123b58e32683cc15c8d37868a4e3ada", 383 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-git.mjs": "412c221c4aed8ddaaf43a0cf0c8d8f3055c7a881fea5dece618c6ec3492654ae", 384 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-go.mjs": "4c52261af3757c0b10283c47addfc140cd7d1d2a83f4831a0de405e1c0d688ea", 385 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-http.mjs": "412cdbc036130ea10d88eecf50ff544f96c23643f168169018a0dcb470211e23", 386 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-ignore.mjs": "8aa778fe4b99791996e02affb66276ffe6452341d7bdbaf572956c4bbb07417d", 387 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-ini.mjs": "90762fc62ce160d22cd58d9572df8646db1d6d7958516bfe3da808ccbab2ba77", 388 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-java.mjs": "0552dad2435a298d5e63be8c3b6f60f181ad1c2ae1ded0b41f8a609c8e64946d", 389 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-javascript.mjs": "1d9fafe38901bf31da89aff10bbdac2fc47246b6ac23a530bf93bfc8a8d3c1ec", 390 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-json.mjs": "ccaf982834cefce181bb76b26b0ecd8f4d97aec8cae52dd4bdbef7b6b6ec3909", 391 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-jsx.mjs": "412618cf980e68491582c939316fb7ba06a845f74604ff2c236e6dc180c7d7c1", 392 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-kotlin.mjs": "b12d18cd74d4b8993b2cba3f3e2d37f9fe565f0f28f0994eafa7687770d1071c", 393 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-less.mjs": "f5887a8206b8a12292fd001f9cc8e6b8bd738990dce728e20529ff233cc13cdc", 394 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-nginx.mjs": "a7ad40bc08dcf3428252b297432ac5a420faa5b7f6ea971ef3ff6bb520bd838c", 395 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-python.mjs": "bdbb464cdb2ce1992265d3383dbce068bbb70c4743b20e5c1548a35a58dc594a", 396 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-rust.mjs": "4fc971a3457c5a5169847046afb2e9055a22b0ceaf834a05e677cbf91d636cf4", 397 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-sass.mjs": "a02fd395cfe776ef20265185b11653ccbd502980fa6b9bac1c2d4769bdb19eda", 398 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-scala.mjs": "d8267cdcef06286f998fdde6d46b385c5df7a6e6110eca7cf06a9df11b03825f", 399 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-scss.mjs": "88e93736e0908b44f5f20c85fa8c435600a6fa73d3efbba5e65810bcf9ba8d77", 400 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-sql.mjs": "1428fe6f280d51f7a4935013c539f468b0cc22b4aa55cba91278594b7710b72c", 401 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-toml.mjs": "e4b6342413db7c6228ad9ce2364deac8aa27e3c1426926ecdce86aad3f5714e9", 402 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-tsx.mjs": "fce7b530b76111be7eaf148e2654c72d576110f07ea6e5c7902f94ac5596c31e", 403 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-typescript.mjs": "4839c2bcfd9e25093422c14abea00b623fb45c4280c4d00411252a3ab7a033fa", 404 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-yaml.mjs": "88df1d5243eb247d63737e54b4b57614f25666889788de26a57223ab22716ce6", 405 | "https://esm.sh/prismjs@1.29.0/denonext/components/prism-zig.mjs": "ebae897c0f18dfec14bbad5b8205b9d827e8704af517328c9b159ff81268d577", 406 | "https://esm.sh/prismjs@1.29.0/denonext/prismjs.mjs": "22ae3128203d6ca4793dae7e1728b8d7db21b54e373e9538cae7a61cce159630", 407 | "https://esm.sh/prismjs@1.29.0?target=denonext": "263ab9a7771b54d8a344ddfc031e31cb5aa0572c25773ea7d0a68cca6f91d060", 408 | "https://esm.sh/sanitize-html@2.14.0/denonext/sanitize-html.mjs": "b4ccc2ed265b7c80fdbe96e16b0c7b148ad6aa3f7fd17537fc00dcd51139665c", 409 | "https://esm.sh/sanitize-html@2.14.0?target=denonext": "38130d3b3a2a41bda587c5ff591c7dba3df005154f67dc5373bef7739107be58", 410 | "https://esm.sh/source-map-js@1.2.1/denonext/source-map-js.mjs": "2129223e17c258b391a47907a69c0b86d1c87cbb66eea7e9b25ff555ec0bbc7c", 411 | "https://esm.sh/source-map-js@1.2.1?target=denonext": "33ba5cf2ee7c1fe6b63b36c31e9075e290bc5c574055acbdc48c2f24a21d2f83" 412 | } 413 | } 414 | -------------------------------------------------------------------------------- /functions/markdown2html/css/gfm.css: -------------------------------------------------------------------------------- 1 | .katex-html { 2 | display: none; 3 | } 4 | 5 | .markdown-body { 6 | --base-size-4: 0.25rem; 7 | --base-size-8: 0.5rem; 8 | --base-size-16: 1rem; 9 | --base-size-24: 1.5rem; 10 | --base-size-40: 2.5rem; 11 | --base-text-weight-normal: 400; 12 | --base-text-weight-medium: 500; 13 | --base-text-weight-semibold: 600; 14 | --fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace; 15 | --fgColor-accent: Highlight; 16 | } 17 | @media (prefers-color-scheme: dark) { 18 | .markdown-body, [data-theme="dark"] { 19 | /* dark */ 20 | color-scheme: dark; 21 | --focus-outlineColor: #1f6feb; 22 | --fgColor-default: #f0f6fc; 23 | --fgColor-muted: #9198a1; 24 | --fgColor-accent: #4493f8; 25 | --fgColor-success: #3fb950; 26 | --fgColor-attention: #d29922; 27 | --fgColor-danger: #f85149; 28 | --fgColor-done: #ab7df8; 29 | --bgColor-default: #0d1117; 30 | --bgColor-muted: #151b23; 31 | --bgColor-neutral-muted: #656c7633; 32 | --bgColor-attention-muted: #bb800926; 33 | --borderColor-default: #3d444d; 34 | --borderColor-muted: #3d444db3; 35 | --borderColor-neutral-muted: #3d444db3; 36 | --borderColor-accent-emphasis: #1f6feb; 37 | --borderColor-success-emphasis: #238636; 38 | --borderColor-attention-emphasis: #9e6a03; 39 | --borderColor-danger-emphasis: #da3633; 40 | --borderColor-done-emphasis: #8957e5; 41 | --color-prettylights-syntax-comment: #9198a1; 42 | --color-prettylights-syntax-constant: #79c0ff; 43 | --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; 44 | --color-prettylights-syntax-entity: #d2a8ff; 45 | --color-prettylights-syntax-storage-modifier-import: #f0f6fc; 46 | --color-prettylights-syntax-entity-tag: #7ee787; 47 | --color-prettylights-syntax-keyword: #ff7b72; 48 | --color-prettylights-syntax-string: #a5d6ff; 49 | --color-prettylights-syntax-variable: #ffa657; 50 | --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; 51 | --color-prettylights-syntax-brackethighlighter-angle: #9198a1; 52 | --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; 53 | --color-prettylights-syntax-invalid-illegal-bg: #8e1519; 54 | --color-prettylights-syntax-carriage-return-text: #f0f6fc; 55 | --color-prettylights-syntax-carriage-return-bg: #b62324; 56 | --color-prettylights-syntax-string-regexp: #7ee787; 57 | --color-prettylights-syntax-markup-list: #f2cc60; 58 | --color-prettylights-syntax-markup-heading: #1f6feb; 59 | --color-prettylights-syntax-markup-italic: #f0f6fc; 60 | --color-prettylights-syntax-markup-bold: #f0f6fc; 61 | --color-prettylights-syntax-markup-deleted-text: #ffdcd7; 62 | --color-prettylights-syntax-markup-deleted-bg: #67060c; 63 | --color-prettylights-syntax-markup-inserted-text: #aff5b4; 64 | --color-prettylights-syntax-markup-inserted-bg: #033a16; 65 | --color-prettylights-syntax-markup-changed-text: #ffdfb6; 66 | --color-prettylights-syntax-markup-changed-bg: #5a1e02; 67 | --color-prettylights-syntax-markup-ignored-text: #f0f6fc; 68 | --color-prettylights-syntax-markup-ignored-bg: #1158c7; 69 | --color-prettylights-syntax-meta-diff-range: #d2a8ff; 70 | --color-prettylights-syntax-sublimelinter-gutter-mark: #3d444d; 71 | } 72 | } 73 | @media (prefers-color-scheme: light) { 74 | .markdown-body, [data-theme="light"] { 75 | /* light */ 76 | color-scheme: light; 77 | --focus-outlineColor: #0969da; 78 | --fgColor-default: #1f2328; 79 | --fgColor-muted: #59636e; 80 | --fgColor-accent: #0969da; 81 | --fgColor-success: #1a7f37; 82 | --fgColor-attention: #9a6700; 83 | --fgColor-danger: #d1242f; 84 | --fgColor-done: #8250df; 85 | --bgColor-default: #ffffff; 86 | --bgColor-muted: #f6f8fa; 87 | --bgColor-neutral-muted: #818b981f; 88 | --bgColor-attention-muted: #fff8c5; 89 | --borderColor-default: #d1d9e0; 90 | --borderColor-muted: #d1d9e0b3; 91 | --borderColor-neutral-muted: #d1d9e0b3; 92 | --borderColor-accent-emphasis: #0969da; 93 | --borderColor-success-emphasis: #1a7f37; 94 | --borderColor-attention-emphasis: #9a6700; 95 | --borderColor-danger-emphasis: #cf222e; 96 | --borderColor-done-emphasis: #8250df; 97 | --color-prettylights-syntax-comment: #59636e; 98 | --color-prettylights-syntax-constant: #0550ae; 99 | --color-prettylights-syntax-constant-other-reference-link: #0a3069; 100 | --color-prettylights-syntax-entity: #6639ba; 101 | --color-prettylights-syntax-storage-modifier-import: #1f2328; 102 | --color-prettylights-syntax-entity-tag: #0550ae; 103 | --color-prettylights-syntax-keyword: #cf222e; 104 | --color-prettylights-syntax-string: #0a3069; 105 | --color-prettylights-syntax-variable: #953800; 106 | --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; 107 | --color-prettylights-syntax-brackethighlighter-angle: #59636e; 108 | --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; 109 | --color-prettylights-syntax-invalid-illegal-bg: #82071e; 110 | --color-prettylights-syntax-carriage-return-text: #f6f8fa; 111 | --color-prettylights-syntax-carriage-return-bg: #cf222e; 112 | --color-prettylights-syntax-string-regexp: #116329; 113 | --color-prettylights-syntax-markup-list: #3b2300; 114 | --color-prettylights-syntax-markup-heading: #0550ae; 115 | --color-prettylights-syntax-markup-italic: #1f2328; 116 | --color-prettylights-syntax-markup-bold: #1f2328; 117 | --color-prettylights-syntax-markup-deleted-text: #82071e; 118 | --color-prettylights-syntax-markup-deleted-bg: #ffebe9; 119 | --color-prettylights-syntax-markup-inserted-text: #116329; 120 | --color-prettylights-syntax-markup-inserted-bg: #dafbe1; 121 | --color-prettylights-syntax-markup-changed-text: #953800; 122 | --color-prettylights-syntax-markup-changed-bg: #ffd8b5; 123 | --color-prettylights-syntax-markup-ignored-text: #d1d9e0; 124 | --color-prettylights-syntax-markup-ignored-bg: #0550ae; 125 | --color-prettylights-syntax-meta-diff-range: #8250df; 126 | --color-prettylights-syntax-sublimelinter-gutter-mark: #818b98; 127 | } 128 | } 129 | 130 | .markdown-body { 131 | -ms-text-size-adjust: 100%; 132 | -webkit-text-size-adjust: 100%; 133 | margin: 0; 134 | color: var(--fgColor-default); 135 | background-color: var(--bgColor-default); 136 | font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"; 137 | font-size: 16px; 138 | line-height: 1.5; 139 | word-wrap: break-word; 140 | } 141 | 142 | .markdown-body .octicon { 143 | display: inline-block; 144 | fill: currentColor; 145 | vertical-align: text-bottom; 146 | } 147 | 148 | .markdown-body h1:hover .anchor .octicon-link:before, 149 | .markdown-body h2:hover .anchor .octicon-link:before, 150 | .markdown-body h3:hover .anchor .octicon-link:before, 151 | .markdown-body h4:hover .anchor .octicon-link:before, 152 | .markdown-body h5:hover .anchor .octicon-link:before, 153 | .markdown-body h6:hover .anchor .octicon-link:before { 154 | width: 16px; 155 | height: 16px; 156 | content: ' '; 157 | display: inline-block; 158 | background-color: currentColor; 159 | -webkit-mask-image: url("data:image/svg+xml,"); 160 | mask-image: url("data:image/svg+xml,"); 161 | } 162 | 163 | .markdown-body details, 164 | .markdown-body figcaption, 165 | .markdown-body figure { 166 | display: block; 167 | } 168 | 169 | .markdown-body summary { 170 | display: list-item; 171 | } 172 | 173 | .markdown-body [hidden] { 174 | display: none !important; 175 | } 176 | 177 | .markdown-body a { 178 | background-color: transparent; 179 | color: var(--fgColor-accent); 180 | text-decoration: none; 181 | } 182 | 183 | .markdown-body abbr[title] { 184 | border-bottom: none; 185 | -webkit-text-decoration: underline dotted; 186 | text-decoration: underline dotted; 187 | } 188 | 189 | .markdown-body b, 190 | .markdown-body strong { 191 | font-weight: var(--base-text-weight-semibold, 600); 192 | } 193 | 194 | .markdown-body dfn { 195 | font-style: italic; 196 | } 197 | 198 | .markdown-body h1 { 199 | margin: .67em 0; 200 | font-weight: var(--base-text-weight-semibold, 600); 201 | padding-bottom: .3em; 202 | font-size: 2em; 203 | border-bottom: 1px solid var(--borderColor-muted); 204 | } 205 | 206 | .markdown-body mark { 207 | background-color: var(--bgColor-attention-muted); 208 | color: var(--fgColor-default); 209 | } 210 | 211 | .markdown-body small { 212 | font-size: 90%; 213 | } 214 | 215 | .markdown-body sub, 216 | .markdown-body sup { 217 | font-size: 75%; 218 | line-height: 0; 219 | position: relative; 220 | vertical-align: baseline; 221 | } 222 | 223 | .markdown-body sub { 224 | bottom: -0.25em; 225 | } 226 | 227 | .markdown-body sup { 228 | top: -0.5em; 229 | } 230 | 231 | .markdown-body img { 232 | border-style: none; 233 | max-width: 100%; 234 | box-sizing: content-box; 235 | } 236 | 237 | .markdown-body code, 238 | .markdown-body kbd, 239 | .markdown-body pre, 240 | .markdown-body samp { 241 | font-family: monospace; 242 | font-size: 1em; 243 | } 244 | 245 | .markdown-body figure { 246 | margin: 1em var(--base-size-40); 247 | } 248 | 249 | .markdown-body hr { 250 | box-sizing: content-box; 251 | overflow: hidden; 252 | background: transparent; 253 | border-bottom: 1px solid var(--borderColor-muted); 254 | height: .25em; 255 | padding: 0; 256 | margin: var(--base-size-24) 0; 257 | background-color: var(--borderColor-default); 258 | border: 0; 259 | } 260 | 261 | .markdown-body input { 262 | font: inherit; 263 | margin: 0; 264 | overflow: visible; 265 | font-family: inherit; 266 | font-size: inherit; 267 | line-height: inherit; 268 | } 269 | 270 | .markdown-body [type=button], 271 | .markdown-body [type=reset], 272 | .markdown-body [type=submit] { 273 | -webkit-appearance: button; 274 | appearance: button; 275 | } 276 | 277 | .markdown-body [type=checkbox], 278 | .markdown-body [type=radio] { 279 | box-sizing: border-box; 280 | padding: 0; 281 | } 282 | 283 | .markdown-body [type=number]::-webkit-inner-spin-button, 284 | .markdown-body [type=number]::-webkit-outer-spin-button { 285 | height: auto; 286 | } 287 | 288 | .markdown-body [type=search]::-webkit-search-cancel-button, 289 | .markdown-body [type=search]::-webkit-search-decoration { 290 | -webkit-appearance: none; 291 | appearance: none; 292 | } 293 | 294 | .markdown-body ::-webkit-input-placeholder { 295 | color: inherit; 296 | opacity: .54; 297 | } 298 | 299 | .markdown-body ::-webkit-file-upload-button { 300 | -webkit-appearance: button; 301 | appearance: button; 302 | font: inherit; 303 | } 304 | 305 | .markdown-body a:hover { 306 | text-decoration: underline; 307 | } 308 | 309 | .markdown-body ::placeholder { 310 | color: var(--fgColor-muted); 311 | opacity: 1; 312 | } 313 | 314 | .markdown-body hr::before { 315 | display: table; 316 | content: ""; 317 | } 318 | 319 | .markdown-body hr::after { 320 | display: table; 321 | clear: both; 322 | content: ""; 323 | } 324 | 325 | .markdown-body table { 326 | border-spacing: 0; 327 | border-collapse: collapse; 328 | display: block; 329 | width: max-content; 330 | max-width: 100%; 331 | overflow: auto; 332 | font-variant: tabular-nums; 333 | } 334 | 335 | .markdown-body td, 336 | .markdown-body th { 337 | padding: 0; 338 | } 339 | 340 | .markdown-body details summary { 341 | cursor: pointer; 342 | } 343 | 344 | .markdown-body a:focus, 345 | .markdown-body [role=button]:focus, 346 | .markdown-body input[type=radio]:focus, 347 | .markdown-body input[type=checkbox]:focus { 348 | outline: 2px solid var(--focus-outlineColor); 349 | outline-offset: -2px; 350 | box-shadow: none; 351 | } 352 | 353 | .markdown-body a:focus:not(:focus-visible), 354 | .markdown-body [role=button]:focus:not(:focus-visible), 355 | .markdown-body input[type=radio]:focus:not(:focus-visible), 356 | .markdown-body input[type=checkbox]:focus:not(:focus-visible) { 357 | outline: solid 1px transparent; 358 | } 359 | 360 | .markdown-body a:focus-visible, 361 | .markdown-body [role=button]:focus-visible, 362 | .markdown-body input[type=radio]:focus-visible, 363 | .markdown-body input[type=checkbox]:focus-visible { 364 | outline: 2px solid var(--focus-outlineColor); 365 | outline-offset: -2px; 366 | box-shadow: none; 367 | } 368 | 369 | .markdown-body a:not([class]):focus, 370 | .markdown-body a:not([class]):focus-visible, 371 | .markdown-body input[type=radio]:focus, 372 | .markdown-body input[type=radio]:focus-visible, 373 | .markdown-body input[type=checkbox]:focus, 374 | .markdown-body input[type=checkbox]:focus-visible { 375 | outline-offset: 0; 376 | } 377 | 378 | .markdown-body kbd { 379 | display: inline-block; 380 | padding: var(--base-size-4); 381 | font: 11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); 382 | line-height: 10px; 383 | color: var(--fgColor-default); 384 | vertical-align: middle; 385 | background-color: var(--bgColor-muted); 386 | border: solid 1px var(--borderColor-neutral-muted); 387 | border-bottom-color: var(--borderColor-neutral-muted); 388 | border-radius: 6px; 389 | box-shadow: inset 0 -1px 0 var(--borderColor-neutral-muted); 390 | } 391 | 392 | .markdown-body h1, 393 | .markdown-body h2, 394 | .markdown-body h3, 395 | .markdown-body h4, 396 | .markdown-body h5, 397 | .markdown-body h6 { 398 | margin-top: var(--base-size-24); 399 | margin-bottom: var(--base-size-16); 400 | font-weight: var(--base-text-weight-semibold, 600); 401 | line-height: 1.25; 402 | } 403 | 404 | .markdown-body h2 { 405 | font-weight: var(--base-text-weight-semibold, 600); 406 | padding-bottom: .3em; 407 | font-size: 1.5em; 408 | border-bottom: 1px solid var(--borderColor-muted); 409 | } 410 | 411 | .markdown-body h3 { 412 | font-weight: var(--base-text-weight-semibold, 600); 413 | font-size: 1.25em; 414 | } 415 | 416 | .markdown-body h4 { 417 | font-weight: var(--base-text-weight-semibold, 600); 418 | font-size: 1em; 419 | } 420 | 421 | .markdown-body h5 { 422 | font-weight: var(--base-text-weight-semibold, 600); 423 | font-size: .875em; 424 | } 425 | 426 | .markdown-body h6 { 427 | font-weight: var(--base-text-weight-semibold, 600); 428 | font-size: .85em; 429 | color: var(--fgColor-muted); 430 | } 431 | 432 | .markdown-body p { 433 | margin-top: 0; 434 | margin-bottom: 10px; 435 | } 436 | 437 | .markdown-body blockquote { 438 | margin: 0; 439 | padding: 0 1em; 440 | color: var(--fgColor-muted); 441 | border-left: .25em solid var(--borderColor-default); 442 | } 443 | 444 | .markdown-body ul, 445 | .markdown-body ol { 446 | margin-top: 0; 447 | margin-bottom: 0; 448 | padding-left: 2em; 449 | } 450 | 451 | .markdown-body ol ol, 452 | .markdown-body ul ol { 453 | list-style-type: lower-roman; 454 | } 455 | 456 | .markdown-body ul ul ol, 457 | .markdown-body ul ol ol, 458 | .markdown-body ol ul ol, 459 | .markdown-body ol ol ol { 460 | list-style-type: lower-alpha; 461 | } 462 | 463 | .markdown-body dd { 464 | margin-left: 0; 465 | } 466 | 467 | .markdown-body tt, 468 | .markdown-body code, 469 | .markdown-body samp { 470 | font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); 471 | font-size: 12px; 472 | } 473 | 474 | .markdown-body pre { 475 | margin-top: 0; 476 | margin-bottom: 0; 477 | font-family: var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace); 478 | font-size: 12px; 479 | word-wrap: normal; 480 | } 481 | 482 | .markdown-body .octicon { 483 | display: inline-block; 484 | overflow: visible !important; 485 | vertical-align: text-bottom; 486 | fill: currentColor; 487 | } 488 | 489 | .markdown-body input::-webkit-outer-spin-button, 490 | .markdown-body input::-webkit-inner-spin-button { 491 | margin: 0; 492 | appearance: none; 493 | } 494 | 495 | .markdown-body .mr-2 { 496 | margin-right: var(--base-size-8, 8px) !important; 497 | } 498 | 499 | .markdown-body::before { 500 | display: table; 501 | content: ""; 502 | } 503 | 504 | .markdown-body::after { 505 | display: table; 506 | clear: both; 507 | content: ""; 508 | } 509 | 510 | .markdown-body>*:first-child { 511 | margin-top: 0 !important; 512 | } 513 | 514 | .markdown-body>*:last-child { 515 | margin-bottom: 0 !important; 516 | } 517 | 518 | .markdown-body a:not([href]) { 519 | color: inherit; 520 | text-decoration: none; 521 | } 522 | 523 | .markdown-body .absent { 524 | color: var(--fgColor-danger); 525 | } 526 | 527 | .markdown-body .anchor { 528 | float: left; 529 | padding-right: var(--base-size-4); 530 | margin-left: -20px; 531 | line-height: 1; 532 | } 533 | 534 | .markdown-body .anchor:focus { 535 | outline: none; 536 | } 537 | 538 | .markdown-body p, 539 | .markdown-body blockquote, 540 | .markdown-body ul, 541 | .markdown-body ol, 542 | .markdown-body dl, 543 | .markdown-body table, 544 | .markdown-body pre, 545 | .markdown-body details { 546 | margin-top: 0; 547 | margin-bottom: var(--base-size-16); 548 | } 549 | 550 | .markdown-body blockquote>:first-child { 551 | margin-top: 0; 552 | } 553 | 554 | .markdown-body blockquote>:last-child { 555 | margin-bottom: 0; 556 | } 557 | 558 | .markdown-body h1 .octicon-link, 559 | .markdown-body h2 .octicon-link, 560 | .markdown-body h3 .octicon-link, 561 | .markdown-body h4 .octicon-link, 562 | .markdown-body h5 .octicon-link, 563 | .markdown-body h6 .octicon-link { 564 | color: var(--fgColor-default); 565 | vertical-align: middle; 566 | visibility: hidden; 567 | } 568 | 569 | .markdown-body h1:hover .anchor, 570 | .markdown-body h2:hover .anchor, 571 | .markdown-body h3:hover .anchor, 572 | .markdown-body h4:hover .anchor, 573 | .markdown-body h5:hover .anchor, 574 | .markdown-body h6:hover .anchor { 575 | text-decoration: none; 576 | } 577 | 578 | .markdown-body h1:hover .anchor .octicon-link, 579 | .markdown-body h2:hover .anchor .octicon-link, 580 | .markdown-body h3:hover .anchor .octicon-link, 581 | .markdown-body h4:hover .anchor .octicon-link, 582 | .markdown-body h5:hover .anchor .octicon-link, 583 | .markdown-body h6:hover .anchor .octicon-link { 584 | visibility: visible; 585 | } 586 | 587 | .markdown-body h1 tt, 588 | .markdown-body h1 code, 589 | .markdown-body h2 tt, 590 | .markdown-body h2 code, 591 | .markdown-body h3 tt, 592 | .markdown-body h3 code, 593 | .markdown-body h4 tt, 594 | .markdown-body h4 code, 595 | .markdown-body h5 tt, 596 | .markdown-body h5 code, 597 | .markdown-body h6 tt, 598 | .markdown-body h6 code { 599 | padding: 0 .2em; 600 | font-size: inherit; 601 | } 602 | 603 | .markdown-body summary h1, 604 | .markdown-body summary h2, 605 | .markdown-body summary h3, 606 | .markdown-body summary h4, 607 | .markdown-body summary h5, 608 | .markdown-body summary h6 { 609 | display: inline-block; 610 | } 611 | 612 | .markdown-body summary h1 .anchor, 613 | .markdown-body summary h2 .anchor, 614 | .markdown-body summary h3 .anchor, 615 | .markdown-body summary h4 .anchor, 616 | .markdown-body summary h5 .anchor, 617 | .markdown-body summary h6 .anchor { 618 | margin-left: -40px; 619 | } 620 | 621 | .markdown-body summary h1, 622 | .markdown-body summary h2 { 623 | padding-bottom: 0; 624 | border-bottom: 0; 625 | } 626 | 627 | .markdown-body ul.no-list, 628 | .markdown-body ol.no-list { 629 | padding: 0; 630 | list-style-type: none; 631 | } 632 | 633 | .markdown-body ol[type="a s"] { 634 | list-style-type: lower-alpha; 635 | } 636 | 637 | .markdown-body ol[type="A s"] { 638 | list-style-type: upper-alpha; 639 | } 640 | 641 | .markdown-body ol[type="i s"] { 642 | list-style-type: lower-roman; 643 | } 644 | 645 | .markdown-body ol[type="I s"] { 646 | list-style-type: upper-roman; 647 | } 648 | 649 | .markdown-body ol[type="1"] { 650 | list-style-type: decimal; 651 | } 652 | 653 | .markdown-body div>ol:not([type]) { 654 | list-style-type: decimal; 655 | } 656 | 657 | .markdown-body ul ul, 658 | .markdown-body ul ol, 659 | .markdown-body ol ol, 660 | .markdown-body ol ul { 661 | margin-top: 0; 662 | margin-bottom: 0; 663 | } 664 | 665 | .markdown-body li>p { 666 | margin-top: var(--base-size-16); 667 | } 668 | 669 | .markdown-body li+li { 670 | margin-top: .25em; 671 | } 672 | 673 | .markdown-body dl { 674 | padding: 0; 675 | } 676 | 677 | .markdown-body dl dt { 678 | padding: 0; 679 | margin-top: var(--base-size-16); 680 | font-size: 1em; 681 | font-style: italic; 682 | font-weight: var(--base-text-weight-semibold, 600); 683 | } 684 | 685 | .markdown-body dl dd { 686 | padding: 0 var(--base-size-16); 687 | margin-bottom: var(--base-size-16); 688 | } 689 | 690 | .markdown-body table th { 691 | font-weight: var(--base-text-weight-semibold, 600); 692 | } 693 | 694 | .markdown-body table th, 695 | .markdown-body table td { 696 | padding: 6px 13px; 697 | border: 1px solid var(--borderColor-default); 698 | } 699 | 700 | .markdown-body table td>:last-child { 701 | margin-bottom: 0; 702 | } 703 | 704 | .markdown-body table tr { 705 | background-color: var(--bgColor-default); 706 | border-top: 1px solid var(--borderColor-muted); 707 | } 708 | 709 | .markdown-body table tr:nth-child(2n) { 710 | background-color: var(--bgColor-muted); 711 | } 712 | 713 | .markdown-body table img { 714 | background-color: transparent; 715 | } 716 | 717 | .markdown-body img[align=right] { 718 | padding-left: 20px; 719 | } 720 | 721 | .markdown-body img[align=left] { 722 | padding-right: 20px; 723 | } 724 | 725 | .markdown-body .emoji { 726 | max-width: none; 727 | vertical-align: text-top; 728 | background-color: transparent; 729 | } 730 | 731 | .markdown-body span.frame { 732 | display: block; 733 | overflow: hidden; 734 | } 735 | 736 | .markdown-body span.frame>span { 737 | display: block; 738 | float: left; 739 | width: auto; 740 | padding: 7px; 741 | margin: 13px 0 0; 742 | overflow: hidden; 743 | border: 1px solid var(--borderColor-default); 744 | } 745 | 746 | .markdown-body span.frame span img { 747 | display: block; 748 | float: left; 749 | } 750 | 751 | .markdown-body span.frame span span { 752 | display: block; 753 | padding: 5px 0 0; 754 | clear: both; 755 | color: var(--fgColor-default); 756 | } 757 | 758 | .markdown-body span.align-center { 759 | display: block; 760 | overflow: hidden; 761 | clear: both; 762 | } 763 | 764 | .markdown-body span.align-center>span { 765 | display: block; 766 | margin: 13px auto 0; 767 | overflow: hidden; 768 | text-align: center; 769 | } 770 | 771 | .markdown-body span.align-center span img { 772 | margin: 0 auto; 773 | text-align: center; 774 | } 775 | 776 | .markdown-body span.align-right { 777 | display: block; 778 | overflow: hidden; 779 | clear: both; 780 | } 781 | 782 | .markdown-body span.align-right>span { 783 | display: block; 784 | margin: 13px 0 0; 785 | overflow: hidden; 786 | text-align: right; 787 | } 788 | 789 | .markdown-body span.align-right span img { 790 | margin: 0; 791 | text-align: right; 792 | } 793 | 794 | .markdown-body span.float-left { 795 | display: block; 796 | float: left; 797 | margin-right: 13px; 798 | overflow: hidden; 799 | } 800 | 801 | .markdown-body span.float-left span { 802 | margin: 13px 0 0; 803 | } 804 | 805 | .markdown-body span.float-right { 806 | display: block; 807 | float: right; 808 | margin-left: 13px; 809 | overflow: hidden; 810 | } 811 | 812 | .markdown-body span.float-right>span { 813 | display: block; 814 | margin: 13px auto 0; 815 | overflow: hidden; 816 | text-align: right; 817 | } 818 | 819 | .markdown-body code, 820 | .markdown-body tt { 821 | padding: .2em .4em; 822 | margin: 0; 823 | font-size: 85%; 824 | white-space: break-spaces; 825 | background-color: var(--bgColor-neutral-muted); 826 | border-radius: 6px; 827 | } 828 | 829 | .markdown-body code br, 830 | .markdown-body tt br { 831 | display: none; 832 | } 833 | 834 | .markdown-body del code { 835 | text-decoration: inherit; 836 | } 837 | 838 | .markdown-body samp { 839 | font-size: 85%; 840 | } 841 | 842 | .markdown-body pre code { 843 | font-size: 100%; 844 | } 845 | 846 | .markdown-body pre>code { 847 | padding: 0; 848 | margin: 0; 849 | word-break: normal; 850 | white-space: pre; 851 | background: transparent; 852 | border: 0; 853 | } 854 | 855 | .markdown-body .highlight { 856 | margin-bottom: var(--base-size-16); 857 | } 858 | 859 | .markdown-body .highlight pre { 860 | margin-bottom: 0; 861 | word-break: normal; 862 | } 863 | 864 | .markdown-body .highlight pre, 865 | .markdown-body pre { 866 | padding: var(--base-size-16); 867 | overflow: auto; 868 | font-size: 85%; 869 | line-height: 1.45; 870 | color: var(--fgColor-default); 871 | background-color: var(--bgColor-muted); 872 | border-radius: 6px; 873 | } 874 | 875 | .markdown-body pre code, 876 | .markdown-body pre tt { 877 | display: inline; 878 | max-width: auto; 879 | padding: 0; 880 | margin: 0; 881 | overflow: visible; 882 | line-height: inherit; 883 | word-wrap: normal; 884 | background-color: transparent; 885 | border: 0; 886 | } 887 | 888 | .markdown-body .csv-data td, 889 | .markdown-body .csv-data th { 890 | padding: 5px; 891 | overflow: hidden; 892 | font-size: 12px; 893 | line-height: 1; 894 | text-align: left; 895 | white-space: nowrap; 896 | } 897 | 898 | .markdown-body .csv-data .blob-num { 899 | padding: 10px var(--base-size-8) 9px; 900 | text-align: right; 901 | background: var(--bgColor-default); 902 | border: 0; 903 | } 904 | 905 | .markdown-body .csv-data tr { 906 | border-top: 0; 907 | } 908 | 909 | .markdown-body .csv-data th { 910 | font-weight: var(--base-text-weight-semibold, 600); 911 | background: var(--bgColor-muted); 912 | border-top: 0; 913 | } 914 | 915 | .markdown-body [data-footnote-ref]::before { 916 | content: "["; 917 | } 918 | 919 | .markdown-body [data-footnote-ref]::after { 920 | content: "]"; 921 | } 922 | 923 | .markdown-body .footnotes { 924 | font-size: 12px; 925 | color: var(--fgColor-muted); 926 | border-top: 1px solid var(--borderColor-default); 927 | } 928 | 929 | .markdown-body .footnotes ol { 930 | padding-left: var(--base-size-16); 931 | } 932 | 933 | .markdown-body .footnotes ol ul { 934 | display: inline-block; 935 | padding-left: var(--base-size-16); 936 | margin-top: var(--base-size-16); 937 | } 938 | 939 | .markdown-body .footnotes li { 940 | position: relative; 941 | } 942 | 943 | .markdown-body .footnotes li:target::before { 944 | position: absolute; 945 | top: calc(var(--base-size-8)*-1); 946 | right: calc(var(--base-size-8)*-1); 947 | bottom: calc(var(--base-size-8)*-1); 948 | left: calc(var(--base-size-24)*-1); 949 | pointer-events: none; 950 | content: ""; 951 | border: 2px solid var(--borderColor-accent-emphasis); 952 | border-radius: 6px; 953 | } 954 | 955 | .markdown-body .footnotes li:target { 956 | color: var(--fgColor-default); 957 | } 958 | 959 | .markdown-body .footnotes .data-footnote-backref g-emoji { 960 | font-family: monospace; 961 | } 962 | 963 | .markdown-body body:has(:modal) { 964 | padding-right: var(--dialog-scrollgutter) !important; 965 | } 966 | 967 | .markdown-body .pl-c { 968 | color: var(--color-prettylights-syntax-comment); 969 | } 970 | 971 | .markdown-body .pl-c1, 972 | .markdown-body .pl-s .pl-v { 973 | color: var(--color-prettylights-syntax-constant); 974 | } 975 | 976 | .markdown-body .pl-e, 977 | .markdown-body .pl-en { 978 | color: var(--color-prettylights-syntax-entity); 979 | } 980 | 981 | .markdown-body .pl-smi, 982 | .markdown-body .pl-s .pl-s1 { 983 | color: var(--color-prettylights-syntax-storage-modifier-import); 984 | } 985 | 986 | .markdown-body .pl-ent { 987 | color: var(--color-prettylights-syntax-entity-tag); 988 | } 989 | 990 | .markdown-body .pl-k { 991 | color: var(--color-prettylights-syntax-keyword); 992 | } 993 | 994 | .markdown-body .pl-s, 995 | .markdown-body .pl-pds, 996 | .markdown-body .pl-s .pl-pse .pl-s1, 997 | .markdown-body .pl-sr, 998 | .markdown-body .pl-sr .pl-cce, 999 | .markdown-body .pl-sr .pl-sre, 1000 | .markdown-body .pl-sr .pl-sra { 1001 | color: var(--color-prettylights-syntax-string); 1002 | } 1003 | 1004 | .markdown-body .pl-v, 1005 | .markdown-body .pl-smw { 1006 | color: var(--color-prettylights-syntax-variable); 1007 | } 1008 | 1009 | .markdown-body .pl-bu { 1010 | color: var(--color-prettylights-syntax-brackethighlighter-unmatched); 1011 | } 1012 | 1013 | .markdown-body .pl-ii { 1014 | color: var(--color-prettylights-syntax-invalid-illegal-text); 1015 | background-color: var(--color-prettylights-syntax-invalid-illegal-bg); 1016 | } 1017 | 1018 | .markdown-body .pl-c2 { 1019 | color: var(--color-prettylights-syntax-carriage-return-text); 1020 | background-color: var(--color-prettylights-syntax-carriage-return-bg); 1021 | } 1022 | 1023 | .markdown-body .pl-sr .pl-cce { 1024 | font-weight: bold; 1025 | color: var(--color-prettylights-syntax-string-regexp); 1026 | } 1027 | 1028 | .markdown-body .pl-ml { 1029 | color: var(--color-prettylights-syntax-markup-list); 1030 | } 1031 | 1032 | .markdown-body .pl-mh, 1033 | .markdown-body .pl-mh .pl-en, 1034 | .markdown-body .pl-ms { 1035 | font-weight: bold; 1036 | color: var(--color-prettylights-syntax-markup-heading); 1037 | } 1038 | 1039 | .markdown-body .pl-mi { 1040 | font-style: italic; 1041 | color: var(--color-prettylights-syntax-markup-italic); 1042 | } 1043 | 1044 | .markdown-body .pl-mb { 1045 | font-weight: bold; 1046 | color: var(--color-prettylights-syntax-markup-bold); 1047 | } 1048 | 1049 | .markdown-body .pl-md { 1050 | color: var(--color-prettylights-syntax-markup-deleted-text); 1051 | background-color: var(--color-prettylights-syntax-markup-deleted-bg); 1052 | } 1053 | 1054 | .markdown-body .pl-mi1 { 1055 | color: var(--color-prettylights-syntax-markup-inserted-text); 1056 | background-color: var(--color-prettylights-syntax-markup-inserted-bg); 1057 | } 1058 | 1059 | .markdown-body .pl-mc { 1060 | color: var(--color-prettylights-syntax-markup-changed-text); 1061 | background-color: var(--color-prettylights-syntax-markup-changed-bg); 1062 | } 1063 | 1064 | .markdown-body .pl-mi2 { 1065 | color: var(--color-prettylights-syntax-markup-ignored-text); 1066 | background-color: var(--color-prettylights-syntax-markup-ignored-bg); 1067 | } 1068 | 1069 | .markdown-body .pl-mdr { 1070 | font-weight: bold; 1071 | color: var(--color-prettylights-syntax-meta-diff-range); 1072 | } 1073 | 1074 | .markdown-body .pl-ba { 1075 | color: var(--color-prettylights-syntax-brackethighlighter-angle); 1076 | } 1077 | 1078 | .markdown-body .pl-sg { 1079 | color: var(--color-prettylights-syntax-sublimelinter-gutter-mark); 1080 | } 1081 | 1082 | .markdown-body .pl-corl { 1083 | text-decoration: underline; 1084 | color: var(--color-prettylights-syntax-constant-other-reference-link); 1085 | } 1086 | 1087 | .markdown-body [role=button]:focus:not(:focus-visible), 1088 | .markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible), 1089 | .markdown-body button:focus:not(:focus-visible), 1090 | .markdown-body summary:focus:not(:focus-visible), 1091 | .markdown-body a:focus:not(:focus-visible) { 1092 | outline: none; 1093 | box-shadow: none; 1094 | } 1095 | 1096 | .markdown-body [tabindex="0"]:focus:not(:focus-visible), 1097 | .markdown-body details-dialog:focus:not(:focus-visible) { 1098 | outline: none; 1099 | } 1100 | 1101 | .markdown-body g-emoji { 1102 | display: inline-block; 1103 | min-width: 1ch; 1104 | font-family: "Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; 1105 | font-size: 1em; 1106 | font-style: normal !important; 1107 | font-weight: var(--base-text-weight-normal, 400); 1108 | line-height: 1; 1109 | vertical-align: -0.075em; 1110 | } 1111 | 1112 | .markdown-body g-emoji img { 1113 | width: 1em; 1114 | height: 1em; 1115 | } 1116 | 1117 | .markdown-body .task-list-item { 1118 | list-style-type: none; 1119 | } 1120 | 1121 | .markdown-body .task-list-item label { 1122 | font-weight: var(--base-text-weight-normal, 400); 1123 | } 1124 | 1125 | .markdown-body .task-list-item.enabled label { 1126 | cursor: pointer; 1127 | } 1128 | 1129 | .markdown-body .task-list-item+.task-list-item { 1130 | margin-top: var(--base-size-4); 1131 | } 1132 | 1133 | .markdown-body .task-list-item .handle { 1134 | display: none; 1135 | } 1136 | 1137 | .markdown-body .task-list-item-checkbox { 1138 | margin: 0 .2em .25em -1.4em; 1139 | vertical-align: middle; 1140 | } 1141 | 1142 | .markdown-body ul:dir(rtl) .task-list-item-checkbox { 1143 | margin: 0 -1.6em .25em .2em; 1144 | } 1145 | 1146 | .markdown-body ol:dir(rtl) .task-list-item-checkbox { 1147 | margin: 0 -1.6em .25em .2em; 1148 | } 1149 | 1150 | .markdown-body .contains-task-list:hover .task-list-item-convert-container, 1151 | .markdown-body .contains-task-list:focus-within .task-list-item-convert-container { 1152 | display: block; 1153 | width: auto; 1154 | height: 24px; 1155 | overflow: visible; 1156 | clip: auto; 1157 | } 1158 | 1159 | .markdown-body ::-webkit-calendar-picker-indicator { 1160 | filter: invert(50%); 1161 | } 1162 | 1163 | .markdown-body .markdown-alert { 1164 | padding: var(--base-size-8) var(--base-size-16); 1165 | margin-bottom: var(--base-size-16); 1166 | color: inherit; 1167 | border-left: .25em solid var(--borderColor-default); 1168 | } 1169 | 1170 | .markdown-body .markdown-alert>:first-child { 1171 | margin-top: 0; 1172 | } 1173 | 1174 | .markdown-body .markdown-alert>:last-child { 1175 | margin-bottom: 0; 1176 | } 1177 | 1178 | .markdown-body .markdown-alert .markdown-alert-title { 1179 | display: flex; 1180 | font-weight: var(--base-text-weight-medium, 500); 1181 | align-items: center; 1182 | line-height: 1; 1183 | } 1184 | 1185 | .markdown-body .markdown-alert.markdown-alert-note { 1186 | border-left-color: var(--borderColor-accent-emphasis); 1187 | } 1188 | 1189 | .markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title { 1190 | color: var(--fgColor-accent); 1191 | } 1192 | 1193 | .markdown-body .markdown-alert.markdown-alert-important { 1194 | border-left-color: var(--borderColor-done-emphasis); 1195 | } 1196 | 1197 | .markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title { 1198 | color: var(--fgColor-done); 1199 | } 1200 | 1201 | .markdown-body .markdown-alert.markdown-alert-warning { 1202 | border-left-color: var(--borderColor-attention-emphasis); 1203 | } 1204 | 1205 | .markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title { 1206 | color: var(--fgColor-attention); 1207 | } 1208 | 1209 | .markdown-body .markdown-alert.markdown-alert-tip { 1210 | border-left-color: var(--borderColor-success-emphasis); 1211 | } 1212 | 1213 | .markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title { 1214 | color: var(--fgColor-success); 1215 | } 1216 | 1217 | .markdown-body .markdown-alert.markdown-alert-caution { 1218 | border-left-color: var(--borderColor-danger-emphasis); 1219 | } 1220 | 1221 | .markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title { 1222 | color: var(--fgColor-danger); 1223 | } 1224 | 1225 | .markdown-body>*:first-child>.heading-element:first-child { 1226 | margin-top: 0 !important; 1227 | } 1228 | 1229 | .markdown-body .highlight pre:has(+.zeroclipboard-container) { 1230 | min-height: 52px; 1231 | } 1232 | 1233 | 1234 | /* GitHub Alert Styles */ 1235 | @media (prefers-color-scheme:dark){.markdown-alert{--color-border-default:#30363d;--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-danger-fg:#f85149;--color-danger-emphasis:#da3633;--color-attention-fg:#d29922;--color-attention-emphasis:#9e6a03;--color-done-fg:#a371f7;--color-done-emphasis:#8957e5;--color-success-fg:#3fb950;--color-success-emphasis:#238636}}@media (prefers-color-scheme:light){.markdown-alert{--color-border-default:#d0d7de;--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-danger-fg:#d1242f;--color-danger-emphasis:#cf222e;--color-attention-fg:#9a6700;--color-attention-emphasis:#9a6700;--color-done-fg:#8250df;--color-done-emphasis:#8250df;--color-success-fg:#1a7f37;--color-success-emphasis:#1f883d}}.markdown-alert{border-left:.25em solid var(--borderColor-default,var(--color-border-default));color:inherit;margin-bottom:16px;padding:.5rem 1em}.markdown-alert>:last-child{margin-bottom:0!important}.markdown-alert .markdown-alert-title{align-items:center;display:flex;font-size:14px;font-weight:500;line-height:1}.markdown-alert .markdown-alert-title svg.octicon{margin-right:var(--base-size-8,8px)!important;fill:currentColor}.markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis,var(--color-accent-emphasis))}.markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent,var(--color-accent-fg))}.markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis,var(--color-success-emphasis))}.markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success,var(--color-success-fg))}.markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis,var(--color-done-emphasis))}.markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done,var(--color-done-fg))}.markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis,var(--color-attention-emphasis))}.markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention,var(--color-attention-fg))}.markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis,var(--color-danger-emphasis))}.markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger,var(--color-danger-fg))} 1236 | --------------------------------------------------------------------------------