├── .github └── workflows │ ├── ci.yml │ └── udd.yml ├── .gitignore ├── .vercelignore ├── LICENSE ├── README.md ├── api └── main.ts ├── deno.json ├── deno.lock ├── deps_dev.ts ├── dev_server.ts ├── generateThemeJson.ts ├── src ├── deps.ts ├── handleErrors.ts ├── handleNotFound.ts ├── logging.ts ├── parseParams.ts ├── slice.ts ├── splitNode.ts ├── svgGet.ts ├── svgLength.test.ts ├── svgLength.ts ├── theme.json └── timing.ts └── vercel.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: denoland/setup-deno@v1 11 | with: 12 | deno-version: "1.30.1" 13 | - name: Run check 14 | run: deno task check 15 | - name: Run test 16 | run: deno test 17 | -------------------------------------------------------------------------------- /.github/workflows/udd.yml: -------------------------------------------------------------------------------- 1 | # from https://zenn.dev/kawarimidoll/articles/c68204d248c107#設定ファイル 2 | name: update-deno-dependencies 3 | 4 | on: 5 | schedule: 6 | - cron: "0 0 * * *" 7 | 8 | jobs: 9 | udd: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: denoland/setup-deno@v1 14 | with: 15 | deno-version: "1.30.1" 16 | - name: Update dependencies 17 | run: > 18 | deno run --allow-net --allow-read --allow-write=./ 19 | --allow-run=deno https://deno.land/x/udd@0.7.2/main.ts deps_dev.ts src/deps.ts 20 | - name: Create Pull Request 21 | uses: peter-evans/create-pull-request@v3 22 | with: 23 | commit-message: ":arrow_up: update deno dependencies" 24 | title: Update Deno Dependencies 25 | body: > 26 | Automated updates by [deno-udd](https://github.com/hayd/deno-udd) 27 | and [create-pull-request](https://github.com/peter-evans/create-pull-request) 28 | GitHub action 29 | branch: update-deno-dependencies 30 | author: GitHub 31 | delete-branch: true 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | -------------------------------------------------------------------------------- /.vercelignore: -------------------------------------------------------------------------------- 1 | /* 2 | !api 3 | !src 4 | !vercel.json 5 | !deno.json 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 takker 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # code2svg 2 | 3 | ソースコードをsyntax highlightつきでSVGにして返すserverless function 4 | 5 | [使い方](https://scrapbox.io/takker/code2svg) 6 | -------------------------------------------------------------------------------- /api/main.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * This is an example of a server that utilizes the router. 3 | */ 4 | 5 | import { 6 | Application, 7 | bold, 8 | lowlight, 9 | Router, 10 | Status, 11 | yellow, 12 | } from "../src/deps.ts"; 13 | import { svgGet } from "../src/svgGet.ts"; 14 | import { timing } from "../src/timing.ts"; 15 | import { logging } from "../src/logging.ts"; 16 | import { handleErrors } from "../src/handleErrors.ts"; 17 | import { handleNotFound } from "../src/handleNotFound.ts"; 18 | import themes from "../src/theme.json" assert { type: "json" }; 19 | 20 | const router = new Router>(); 21 | router 22 | .get("/list/languages", (context) => { 23 | context.response.status = Status.OK; 24 | context.response.type = "json"; 25 | context.response.body = lowlight.listLanguages(); 26 | context.response.headers.set( 27 | "expires", 28 | new Date(Date.now() + 86_400).toUTCString(), 29 | ); 30 | }) 31 | .get("/list/themes", (context) => { 32 | context.response.status = Status.OK; 33 | context.response.type = "json"; 34 | context.response.body = [...Object.keys(themes)].sort(); 35 | context.response.headers.set( 36 | "expires", 37 | new Date(Date.now() + 86_400).toUTCString(), 38 | ); 39 | }) 40 | .get( 41 | "/svg/:options?/:proto(http:/?|https:/?)/:host/:path(.*)?", 42 | svgGet, 43 | ); 44 | 45 | const app = new Application(); 46 | 47 | app.use(logging); 48 | app.use(timing); 49 | app.use(handleErrors); 50 | 51 | // Use the router 52 | app.use(router.routes()); 53 | app.use(router.allowedMethods()); 54 | 55 | // A basic 404 page 56 | app.use(handleNotFound); 57 | 58 | app.addEventListener("listen", ({ hostname, port, serverType }) => { 59 | console.log(`${bold("Start listening on ")}${yellow(`${hostname}:${port}`)}`); 60 | console.log(`${bold(" using HTTP server: ")}${yellow(serverType)}`); 61 | }); 62 | 63 | export default app.handle; 64 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "dev": "deno run --allow-net --watch dev_server.ts", 4 | "deploy": "yarn run vercel", 5 | "genTheme": "deno run --allow-net=api.github.com,raw.githubusercontent.com --allow-write=./src/theme.json generateThemeJson.ts", 6 | "check": "deno fmt --check && deno lint && deno check api/main.ts dev_server.ts generateThemeJson.ts", 7 | "lint": "deno fmt && deno lint" 8 | }, 9 | "compilerOptions": { 10 | "lib": ["esnext", "dom", "dom.iterable", "dom.asyncIterable", "deno.ns"] 11 | }, 12 | "fmt": { 13 | "files": { 14 | "exclude": ["src/theme.json"] 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2", 3 | "remote": { 4 | "https://cdn.skypack.dev/-/@octokit/auth-token@v3.0.2-6StUcbMMryxBbbtdl0g6/dist=es2019,mode=imports/optimized/@octokit/auth-token.js": "5247df74f0bd63d994d1ab5b52265761cf2eb1b67f12171a030ebef4027d5eb6", 5 | "https://cdn.skypack.dev/-/@octokit/core@v4.2.0-o34eNNHbTt3m8fabSUgI/dist=es2019,mode=imports/optimized/@octokit/core.js": "51942f9b2fb6b60a6ad88c3985fe77a313b0b7ada6ea5ddd50478d774f724361", 6 | "https://cdn.skypack.dev/-/@octokit/core@v4.2.0-o34eNNHbTt3m8fabSUgI/dist=es2019,mode=types/dist-types/index.d.ts": "da400c1e70998eeea082bc2511412bc769c4318b6fd32478443223b491b72922", 7 | "https://cdn.skypack.dev/-/@octokit/core@v4.2.0-o34eNNHbTt3m8fabSUgI/dist=es2019,mode=types/dist-types/types.d.ts": "9254014e2351b20a4ca1962004a2ce5e349f4870ea4b9a4e453c5e3fcde671a0", 8 | "https://cdn.skypack.dev/-/@octokit/endpoint@v7.0.3-qAKvgTmZVvPvlZmtx3DJ/dist=es2019,mode=imports/optimized/@octokit/endpoint.js": "53598eeb2952f4b1b728d6229684f298ea97f615a02de9611045e5dcd8a013d6", 9 | "https://cdn.skypack.dev/-/@octokit/graphql@v5.0.5-6aggIc6UFzk0RTCBmJPv/dist=es2019,mode=imports/optimized/@octokit/graphql.js": "de060f19e042544ba5b61b7cb977d4ab18e6436cfafb4ac03ecefe3511dcde2b", 10 | "https://cdn.skypack.dev/-/@octokit/graphql@v5.0.5-6aggIc6UFzk0RTCBmJPv/dist=es2019,mode=types/dist-types/error.d.ts": "f6985668c3886383bf21ad607beecda7e56d555cbd4a8cbaef878249ceb37df5", 11 | "https://cdn.skypack.dev/-/@octokit/graphql@v5.0.5-6aggIc6UFzk0RTCBmJPv/dist=es2019,mode=types/dist-types/index.d.ts": "1bb85bd0ebefc42f0686321a4bdef2ee698b9e14144177102cf2d04ed11ebb32", 12 | "https://cdn.skypack.dev/-/@octokit/graphql@v5.0.5-6aggIc6UFzk0RTCBmJPv/dist=es2019,mode=types/dist-types/types.d.ts": "af728fc71268565b01666fcc565c809e26eb9a2260025a89be77ad6dfd14489c", 13 | "https://cdn.skypack.dev/-/@octokit/openapi-types@v14.0.0-KD7Y4fuQRWesAyHKL6PE/dist=es2019,mode=types/types.d.ts": "4885183969bc6e3de0cc1d5e396ae0ccc79cc4b1ff6a43d1dcb9c041ff658ccb", 14 | "https://cdn.skypack.dev/-/@octokit/openapi-types@v16.0.0-unnyRO3bXt1sQJOUFoNL/dist=es2019,mode=types/types.d.ts": "6babad1050df6dd3ce4caa33c2cb5b0570f3aa74c971997726b0d68a68066f2e", 15 | "https://cdn.skypack.dev/-/@octokit/plugin-rest-endpoint-methods@v7.0.1-dfCGsR6IfccXnfe6hbym/dist=es2019,mode=imports/optimized/@octokit/plugin-rest-endpoint-methods.js": "a8d91a4ef933aed64b667c758abc4f45a2851fab5f00d6c17178e46412271279", 16 | "https://cdn.skypack.dev/-/@octokit/plugin-rest-endpoint-methods@v7.0.1-dfCGsR6IfccXnfe6hbym/dist=es2019,mode=types/dist-types/generated/method-types.d.ts": "2a2553ad5633bb0a05b4ae1669ef4769a292519610b52c87855dd414e6399065", 17 | "https://cdn.skypack.dev/-/@octokit/plugin-rest-endpoint-methods@v7.0.1-dfCGsR6IfccXnfe6hbym/dist=es2019,mode=types/dist-types/generated/parameters-and-response-types.d.ts": "896d6488b51325265c5ee25211f91bbfcc69156550578396745113e0228b6f9c", 18 | "https://cdn.skypack.dev/-/@octokit/plugin-rest-endpoint-methods@v7.0.1-dfCGsR6IfccXnfe6hbym/dist=es2019,mode=types/dist-types/index.d.ts": "bb6de8efec83834e548348892bd43a7899d4469e8babaaa11c47a3f24f9f2620", 19 | "https://cdn.skypack.dev/-/@octokit/plugin-rest-endpoint-methods@v7.0.1-dfCGsR6IfccXnfe6hbym/dist=es2019,mode=types/dist-types/types.d.ts": "a5fbbdae26e8c89ef3109f1d93a9b678edb8cd942b285ab578404b8fc2570ec2", 20 | "https://cdn.skypack.dev/-/@octokit/request-error@v3.0.2-JmEYUgONS3hRDLQaCOAP/dist=es2019,mode=imports/optimized/@octokit/request-error.js": "72409dbe6dabfeed08701e925eb837aa7965c58cdeed3dcedd345d0037965837", 21 | "https://cdn.skypack.dev/-/@octokit/request-error@v3.0.3-ZZm6tnw1YJ6j1QaxxSlM/dist=es2019,mode=types/dist-types/index.d.ts": "6cc291b120e0b73d4d1e72932266717c7fbd8fafdc5a5ead9291545c9abf42a0", 22 | "https://cdn.skypack.dev/-/@octokit/request-error@v3.0.3-ZZm6tnw1YJ6j1QaxxSlM/dist=es2019,mode=types/dist-types/types.d.ts": "d4b6a1f0b428ac38ab410730bb54a9bc5ba882dc0228d35e655c3653fd4b3573", 23 | "https://cdn.skypack.dev/-/@octokit/request@v6.2.2-QeQLqIePxKxHvkZWYfNG/dist=es2019,mode=imports/optimized/@octokit/request.js": "7a99d2059127b16007f77938b3097d079d86d46bf44c03186852818837af3045", 24 | "https://cdn.skypack.dev/-/@octokit/request@v6.2.2-QeQLqIePxKxHvkZWYfNG/dist=es2019,mode=types/dist-types/index.d.ts": "89c91c7faab3a756c98631b19bb6472a24608da950b3f1f7fb2e1a2aedebc30a", 25 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/AuthInterface.d.ts": "8572de0d5253e0f22b693942c425e94324d5a2aede690d1003c799028edf3caa", 26 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/EndpointDefaults.d.ts": "8574e3d00f60c5bc2ae903e9404281f4fde55be7ba0cc7d28a25193346ce4de2", 27 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/EndpointInterface.d.ts": "9dde10f9de2b477a9540ce6becfb1a7fef16150bada03e97544fe5fbcf6526cd", 28 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/EndpointOptions.d.ts": "6c4aa1bd879508bac9a852241bf12df46e26bea480eb01f73796b41a2bc88b59", 29 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/Fetch.d.ts": "af628c57e9826fbe767ae6afbffa7b197405a8c53ba6197bb32e806d35c1ca8f", 30 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/GetResponseTypeFromEndpointMethod.d.ts": "7a50f76e773ead4a34b5308879130da83192040ef6dafc5f18570ff6ad2bda61", 31 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/OctokitResponse.d.ts": "6eae800c106a3bdbe715aa529a5da5095412660499d1ae30af2006c37a856bf1", 32 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestError.d.ts": "74fd4b09963df6d2a1c94b653199c48d5a578164517a7ae27ff86771662f6764", 33 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestHeaders.d.ts": "a9cdd476c9e36aa3bf4212f4337254f2f2676506aabb6f7d8f6db50490d25c33", 34 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestInterface.d.ts": "2b618fa2944c1c017729621149f3f8367a9adf0cc80ea43f009d561be0462334", 35 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestMethod.d.ts": "54160aaec4f72e2045e7341301c096344b9e5162a1e48333a531117af5938713", 36 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestOptions.d.ts": "2f984d3e5fade22b3b2d95dfd96e95ff6a26bea4eb481e374d648ce164522172", 37 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestParameters.d.ts": "91202ed89b37f45a577d72fb1bca150a85f57cb3799e87eacb2bfe4e6cbf2c3d", 38 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/RequestRequestOptions.d.ts": "b6a67029dfab43cf2eeb88538719e0796f64baf891a5e06c9f34b2f9d331c4f5", 39 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/ResponseHeaders.d.ts": "7f7aa3e938180da966143e16c4686c7eb2ab8d0f762f038648e1cc6577e1d52e", 40 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/Route.d.ts": "2c574466b0d7ded0bfedaea3660d8f008cefa06db748d79274b4aaea46564763", 41 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/Signal.d.ts": "76b87f8b5d13712d3fc53a231be1664c4071186120624f2ae1b5bf3db6c7b502", 42 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/StrategyInterface.d.ts": "5bd1f80c2ad3d97b86125fe945a1638f62a0039007520091a29bd9d2f4086381", 43 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/Url.d.ts": "3f0d8705992ebf25221e0d3f72d496bbcebacb47c2b6ee90f4de66d760ee9152", 44 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/VERSION.d.ts": "4ad420ef651e197757f1cc6a44051d55bf60fe2ccff2e5335d723541ce066207", 45 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/generated/Endpoints.d.ts": "c5c3914212ee0fb8aa7952ed30df8f6f2c584adbf5766d0e22798adae114f2a1", 46 | "https://cdn.skypack.dev/-/@octokit/types@v8.0.0-2LHKv7LnzBHU2IWrPnnC/dist=es2019,mode=types/dist-types/index.d.ts": "11b20e22a2ac28f91758c4615719da3200d65868c8c7fd2f83a0506dd03a95f2", 47 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/AuthInterface.d.ts": "8572de0d5253e0f22b693942c425e94324d5a2aede690d1003c799028edf3caa", 48 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/EndpointDefaults.d.ts": "0fc3cbd588a1e646f828df024b73fd8de57073f7242ce7e1060f95f353eb4589", 49 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/EndpointInterface.d.ts": "9dde10f9de2b477a9540ce6becfb1a7fef16150bada03e97544fe5fbcf6526cd", 50 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/EndpointOptions.d.ts": "05b3308ffcd7bde83fa77d9f083db83d4e6518300b87364e90a41c8680f6374b", 51 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/Fetch.d.ts": "45d8db9ee4ddbc94861cf9192b30305ba7d72aea6a593961b17e7152c5916bd0", 52 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/GetResponseTypeFromEndpointMethod.d.ts": "a4c07340daf98bb36410874a47a9c6f8de19fa54b015505f173bffb802fd110a", 53 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/OctokitResponse.d.ts": "b6b0a3224b2f697f4f1abfccfd9277816aa3d4f2550d49c57b67c1ed669c6bd4", 54 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestError.d.ts": "b6f2a56a96124f9d919e98532b4d0299d1c0798881bc30da196845d4f0d9a374", 55 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestHeaders.d.ts": "5da94e87e7ddce31c028d6b1211c5c4e9b5b82e5a4b5caeb6cf7c5d071d6e0f3", 56 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestInterface.d.ts": "2b618fa2944c1c017729621149f3f8367a9adf0cc80ea43f009d561be0462334", 57 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestMethod.d.ts": "1257ee54981d320653568ebc2bd84cf1ef6ccd42c6fb301a76b1faf87a54dbd5", 58 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestOptions.d.ts": "881419a9d62e2fbf7e501a9e270a424bcba5acd2deff2930e35183db7d9fb5a8", 59 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestParameters.d.ts": "fe888f68a5aff593bca2dec813837ddbd341790ca02b7c50058a3a2aec29df1a", 60 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/RequestRequestOptions.d.ts": "f9d97bc9c69fcdfa999595fe4caa93ed967cd2e94358134880b35e18938a0639", 61 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/ResponseHeaders.d.ts": "d51c97c7be9951d58cb068411a1bdc101b5e2c78639a2143c729d3dfdfd104b0", 62 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/Route.d.ts": "5180a1a33602d0eb1ff18a8370eab0bc98f81060f4c64dcbbfab9d8db0075379", 63 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/Signal.d.ts": "f96f8df3e47e27cab8159e91a4f35cab83ba8acc751731c64c23437f60a2bc83", 64 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/StrategyInterface.d.ts": "5bd1f80c2ad3d97b86125fe945a1638f62a0039007520091a29bd9d2f4086381", 65 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/Url.d.ts": "9ab0a0c34faa1a3dd97f2f3350be4ecf195d0e8a41b92e534f6d9c910557a2e6", 66 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/VERSION.d.ts": "24de9abc33adbb1de5aa3e52107237e79eae6311b6905c0b5230991a65fcd9c2", 67 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/generated/Endpoints.d.ts": "849024ce5ecfb1763b41e20d765bd56a11c42dc12a14e50fd8b4a28d0e5f0e12", 68 | "https://cdn.skypack.dev/-/@octokit/types@v9.0.0-QkpI5YAz0eTPVBsCIDRj/dist=es2019,mode=types/dist-types/index.d.ts": "11b20e22a2ac28f91758c4615719da3200d65868c8c7fd2f83a0506dd03a95f2", 69 | "https://cdn.skypack.dev/-/before-after-hook@v2.2.3-BExrEObnN5fqJ4Awg6nm/dist=es2019,mode=imports/optimized/before-after-hook.js": "d8dc01095d8c3892f00eafc8a9a6ccdcad3502aa91bbdbcf575916ab203e08f4", 70 | "https://cdn.skypack.dev/-/before-after-hook@v2.2.3-BExrEObnN5fqJ4Awg6nm/dist=es2019,mode=types/index.d.ts": "0726d18ac9cb69b989c60a9804b7b0f628b5bc95e5e8878a4cc5f5e7dad6ee65", 71 | "https://cdn.skypack.dev/-/deprecation@v2.3.1-uvOjAQiALAZPHmrlznlP/dist=es2019,mode=imports/optimized/deprecation.js": "193048b24ad63bc08fa2acbc65df7b57ddd8421aec8abf378e38e6978b5c0b33", 72 | "https://cdn.skypack.dev/-/is-plain-object@v5.0.0-8mrVMp9y5RYdpZYGe1Tt/dist=es2019,mode=imports/optimized/is-plain-object.js": "c3fcee678ef371dba4c260b766215ad645777e698f6f857738b6c4b98ad34b93", 73 | "https://cdn.skypack.dev/-/once@v1.4.0-dZva3nt1fLBY6vpXF5Hj/dist=es2019,mode=imports/optimized/once.js": "2ecef4cecb6b0f4aec108af8e23b1d23304494bea8fc569464a6c2a11fda6486", 74 | "https://cdn.skypack.dev/-/universal-user-agent@v6.0.0-fUAPE3UH5QP7qG0fd0dH/dist=es2019,mode=imports/optimized/universal-user-agent.js": "24df9219684b303ca065c02733e601d11b3ed63a35ec8e473094006d65f6ded9", 75 | "https://cdn.skypack.dev/-/wrappy@v1.0.2-e8nLh7Qms0NRhbAbUpJP/dist=es2019,mode=imports/optimized/wrappy.js": "01dc1f36207f5400dad37bac2acddb2de0466953f289b8c84b7100e8b160fbb2", 76 | "https://cdn.skypack.dev/@octokit/core@4.2.0?dts": "adb410f83b83a65f9e7c41922e6a7e5836a7c8023569f60196ac87e65afe97bb", 77 | "https://cdn.skypack.dev/@octokit/plugin-rest-endpoint-methods@7.0.1?dts": "9cd6fd03ae09f430037a0bac1f97eb2b99a1e9d682b55b1756642e7fb5c28fbd", 78 | "https://deno.land/std@0.152.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", 79 | "https://deno.land/std@0.152.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49", 80 | "https://deno.land/std@0.152.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", 81 | "https://deno.land/std@0.152.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4", 82 | "https://deno.land/std@0.152.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a", 83 | "https://deno.land/std@0.152.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", 84 | "https://deno.land/std@0.152.0/crypto/timing_safe_equal.ts": "82a29b737bc8932d75d7a20c404136089d5d23629e94ba14efa98a8cc066c73e", 85 | "https://deno.land/std@0.152.0/encoding/base64.ts": "c57868ca7fa2fbe919f57f88a623ad34e3d970d675bdc1ff3a9d02bba7409db2", 86 | "https://deno.land/std@0.152.0/fmt/colors.ts": "6f9340b7fb8cc25a993a99e5efc56fe81bb5af284ff412129dd06df06f53c0b4", 87 | "https://deno.land/std@0.152.0/http/_negotiation/common.ts": "410e902f01cdd324e4746e8017595be4fc357d6fc4cd6044f2f808a943d7eaf7", 88 | "https://deno.land/std@0.152.0/http/_negotiation/encoding.ts": "f749c1d539d139af783e8a7741de5a47a98a5e3c9af82b8af512567ccf5fe632", 89 | "https://deno.land/std@0.152.0/http/_negotiation/language.ts": "53c306186904d2dace4c624a8822542866ad332a7f40ac90e0af1504f95c63d0", 90 | "https://deno.land/std@0.152.0/http/_negotiation/media_type.ts": "ecdda87286495f7ff25116858f5088856953e2f1585e593d314e0c71b826a137", 91 | "https://deno.land/std@0.152.0/http/http_errors.ts": "fe9b7f95f7ee0592c3306f8c7aed03ba53d55d1ef81e00041c1171b9588f46d9", 92 | "https://deno.land/std@0.152.0/http/http_status.ts": "897575a7d6bc2b9123f6a38ecbc0f03d95a532c5d92029315dc9f508e12526b8", 93 | "https://deno.land/std@0.152.0/http/negotiation.ts": "f35b1ff2ad4ff9feaa00ac234960b398172768205c8eceaef7f2eafe34716ba2", 94 | "https://deno.land/std@0.152.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", 95 | "https://deno.land/std@0.152.0/io/readers.ts": "45847ad404afd2f605eae1cff193f223462bc55eeb9ae313c2f3db28aada0fd6", 96 | "https://deno.land/std@0.152.0/io/types.d.ts": "0cae3a62da7a37043661746c65c021058bae020b54e50c0e774916e5d4baee43", 97 | "https://deno.land/std@0.152.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", 98 | "https://deno.land/std@0.152.0/media_types/mod.ts": "3829264ca0610cac40f3214f939d7733483523f82bc1041c51045d7c75fb93b8", 99 | "https://deno.land/std@0.152.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", 100 | "https://deno.land/std@0.152.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", 101 | "https://deno.land/std@0.152.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", 102 | "https://deno.land/std@0.152.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", 103 | "https://deno.land/std@0.152.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", 104 | "https://deno.land/std@0.152.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", 105 | "https://deno.land/std@0.152.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac", 106 | "https://deno.land/std@0.152.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa", 107 | "https://deno.land/std@0.152.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", 108 | "https://deno.land/std@0.152.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c", 109 | "https://deno.land/std@0.152.0/streams/conversion.ts": "fc3db02026183da795fa32ac7549868e9f19c75ba029d4b4c3739af62b48517a", 110 | "https://deno.land/std@0.152.0/testing/_diff.ts": "029a00560b0d534bc0046f1bce4bd36b3b41ada3f2a3178c85686eb2ff5f1413", 111 | "https://deno.land/std@0.152.0/testing/_format.ts": "0d8dc79eab15b67cdc532826213bbe05bccfd276ca473a50a3fc7bbfb7260642", 112 | "https://deno.land/std@0.152.0/testing/asserts.ts": "093735c88f52bbead7f60a1f7a97a2ce4df3c2d5fab00a46956f20b4a5793ccd", 113 | "https://deno.land/std@0.177.0/async/abortable.ts": "73acfb3ed7261ce0d930dbe89e43db8d34e017b063cf0eaa7d215477bf53442e", 114 | "https://deno.land/std@0.177.0/async/deadline.ts": "c5facb0b404eede83e38bd2717ea8ab34faa2ffb20ef87fd261fcba32ba307aa", 115 | "https://deno.land/std@0.177.0/async/debounce.ts": "adab11d04ca38d699444ac8a9d9856b4155e8dda2afd07ce78276c01ea5a4332", 116 | "https://deno.land/std@0.177.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8", 117 | "https://deno.land/std@0.177.0/async/delay.ts": "73aa04cec034c84fc748c7be49bb15cac3dd43a57174bfdb7a4aec22c248f0dd", 118 | "https://deno.land/std@0.177.0/async/mod.ts": "f04344fa21738e5ad6bea37a6bfffd57c617c2d372bb9f9dcfd118a1b622e576", 119 | "https://deno.land/std@0.177.0/async/mux_async_iterator.ts": "70c7f2ee4e9466161350473ad61cac0b9f115cff4c552eaa7ef9d50c4cbb4cc9", 120 | "https://deno.land/std@0.177.0/async/pool.ts": "fd082bd4aaf26445909889435a5c74334c017847842ec035739b4ae637ae8260", 121 | "https://deno.land/std@0.177.0/async/retry.ts": "5efa3ba450ac0c07a40a82e2df296287b5013755d232049efd7ea2244f15b20f", 122 | "https://deno.land/std@0.177.0/async/tee.ts": "47e42d35f622650b02234d43803d0383a89eb4387e1b83b5a40106d18ae36757", 123 | "https://deno.land/std@0.177.0/http/server.ts": "cbb17b594651215ba95c01a395700684e569c165a567e4e04bba327f41197433", 124 | "https://deno.land/x/oak@v11.1.0/application.ts": "0a728331822b8e27727ceec48a8499657c3163fc48fd379a8a9578a75f3cdb62", 125 | "https://deno.land/x/oak@v11.1.0/body.ts": "78402a4936accb80372c4944384658105604352d6783de7ff1e36b8832dd93c9", 126 | "https://deno.land/x/oak@v11.1.0/buf_reader.ts": "7cf96aa0ac670b75098113cf88a291a68332cc45efa8a9698f064ac5b8098a0f", 127 | "https://deno.land/x/oak@v11.1.0/content_disposition.ts": "8b8c3cb2fba7138cd5b7f82fc3b5ea39b33db924a824b28261659db7e164621e", 128 | "https://deno.land/x/oak@v11.1.0/context.ts": "014d1ce40e62a7901411425541b0d5a08018968a330595bd686f8d00222a35bb", 129 | "https://deno.land/x/oak@v11.1.0/cookies.ts": "d9f94b99f26c6169c6982ce12323c41a548d001bfc28f464264c22dc3dbf2181", 130 | "https://deno.land/x/oak@v11.1.0/deps.ts": "b897b0f2bec99cd8b402b279b7f21de955d98cbd72835b6c912be5e11c26148b", 131 | "https://deno.land/x/oak@v11.1.0/etag.ts": "19918f5e1964e3fe6c9fe524a88ffbf9900ce1dfe4146b187b2a86256bb6b663", 132 | "https://deno.land/x/oak@v11.1.0/headers.ts": "f50fb05614432bda971021633129aa2e8737e0844e0f01c27a937997b4d8dd4f", 133 | "https://deno.land/x/oak@v11.1.0/helpers.ts": "42212afa07a560b2958359cc19577417e89d9574d6579551a0af36ff7f00cc6e", 134 | "https://deno.land/x/oak@v11.1.0/http_request.ts": "0831c828816fcb58a5aa8361c6865c4151f4c8b59fabcef2e2cd235bb28170c5", 135 | "https://deno.land/x/oak@v11.1.0/http_server_flash.ts": "e312754acad26d3d70f243d657547e697921f67f0a2179dbec41a20a3228fd79", 136 | "https://deno.land/x/oak@v11.1.0/http_server_native.ts": "549dffcd2db5cbb0e44ad50cf9c54956b42a10450b1ac66e1362e32a073c8c1b", 137 | "https://deno.land/x/oak@v11.1.0/http_server_native_request.ts": "07910ea2ed51af6c4e69addf9015cdd8d2b5c9ee03fd4993e386834a129a9eb6", 138 | "https://deno.land/x/oak@v11.1.0/isMediaType.ts": "62d638abcf837ece3a8f07a4b7ca59794135cb0d4b73194c7d5837efd4161005", 139 | "https://deno.land/x/oak@v11.1.0/keyStack.ts": "fa0d5898fb8ba34de1c9cdcf4b2e8434952dc9931671858d33560368784a22ef", 140 | "https://deno.land/x/oak@v11.1.0/mediaTyper.ts": "042b853fc8e9c3f6c628dd389e03ef481552bf07242efc3f8a1af042102a6105", 141 | "https://deno.land/x/oak@v11.1.0/middleware.ts": "de14f045a2ddfe845d89b5d3140ff52cbcc6f3b3965391106ce04480f9786737", 142 | "https://deno.land/x/oak@v11.1.0/middleware/proxy.ts": "b927232f97ec18af4185d7912e45b1191e3ffe24a9c875262ad524211b1274c9", 143 | "https://deno.land/x/oak@v11.1.0/mod.ts": "de52855c8f626e30ba683fb265c0a0773ba2f5f117b3549b7d9c857edba58338", 144 | "https://deno.land/x/oak@v11.1.0/multipart.ts": "98fe9f226de8c26a16d067027b69fb1e34ad8c4055767dd157907d06cea36f9a", 145 | "https://deno.land/x/oak@v11.1.0/range.ts": "68a6df7ab3b868843e33f52deb94c3d4cab25cb9ef369691990c2ac15b04fafb", 146 | "https://deno.land/x/oak@v11.1.0/request.ts": "5852ad36389b48e0428a6f3c90854d01f10d1b15949b56001e1e75c2a00ef0f9", 147 | "https://deno.land/x/oak@v11.1.0/response.ts": "867d81f7eb0c65c7b8e0e0e9e145ededd5b6daa9ad922e6adc6a36a525f439a6", 148 | "https://deno.land/x/oak@v11.1.0/router.ts": "187522a549f6c179ff01d321882a8bfacbfb7f3e24b004ec4534a3613c7f9b0e", 149 | "https://deno.land/x/oak@v11.1.0/send.ts": "7ef2591792426d62add91536bb434566d4b224247ca343fdd63e486f9d4e9446", 150 | "https://deno.land/x/oak@v11.1.0/server_sent_event.ts": "948b0fe4cb3fe38c7db15e476eb3b7671ef20e566d130e9f701d7c0146aa47dd", 151 | "https://deno.land/x/oak@v11.1.0/structured_clone.ts": "ecf42598652b8082f37252cb873d6e257ad728e6fe73c6bd61f343d94501fbde", 152 | "https://deno.land/x/oak@v11.1.0/testing.ts": "7612656efd2975f7a2e6848609f5971922dbec46b76372c5c623202fdd7b9a85", 153 | "https://deno.land/x/oak@v11.1.0/types.d.ts": "41951a18c3bfdb11e40707cab75da078ba8a4907cd7d4e11d8536bc2db0dde05", 154 | "https://deno.land/x/oak@v11.1.0/util.ts": "3af8c4ed04c6cc2bedbe66e562a77fc59c72df31c55a902a63885861ca1639d6", 155 | "https://deno.land/x/path_to_regexp@v6.2.1/index.ts": "894060567837bae8fc9c5cbd4d0a05e9024672083d5883b525c031eea940e556", 156 | "https://esm.sh/hast-util-to-html@8.0.4": "3c14aec71fabe0bfb166813b31d950ff343eaab7e8b9855530df07cc477f4b4e", 157 | "https://esm.sh/lowlight@2.8.1/lib/all.js": "b784278acaaea2771b0e201e0d1caffb42bec8c796efdc003e65993f2e508eea", 158 | "https://esm.sh/v106/@types/hast@2.3.4/index.d.ts": "6075cc26a4cf5f221af7e5577d87bd89d5004b679c4fbc89db2be6ecc7f55c19", 159 | "https://esm.sh/v106/@types/unist@2.0.6/index.d.ts": "cddf5c26907c0b8378bc05543161c11637b830da9fadf59e02a11e675d11e180", 160 | "https://esm.sh/v107/@types/hast@2.3.4/index.d.ts": "a8559efcd73b8692b8c27d06fb61397f2012b516659ec96f662c743c8256f0b8", 161 | "https://esm.sh/v107/@types/unist@2.0.6/index.d.ts": "cddf5c26907c0b8378bc05543161c11637b830da9fadf59e02a11e675d11e180", 162 | "https://esm.sh/v107/ccount@2.0.1/deno/ccount.js": "781a282240c061ffb5ea667bf0235486d2c9f2a6f0267bdf0081c830806f18e2", 163 | "https://esm.sh/v107/character-entities-html4@2.1.0/deno/character-entities-html4.js": "4b00247e4ab9ad02b8d29caec8d527918957a4053e7382d78407dde0302633fa", 164 | "https://esm.sh/v107/character-entities-legacy@3.0.0/deno/character-entities-legacy.js": "610f382fad74f0c4dc090b4b4636097b7bd905e5bf67194f7f10f44d2c39f69d", 165 | "https://esm.sh/v107/comma-separated-tokens@2.0.3/deno/comma-separated-tokens.js": "93396131a10a9ec4063ed33aa1c76686370f67beb1720f0c53a1b9b7247f22b7", 166 | "https://esm.sh/v107/fault@2.0.1/deno/fault.js": "51ae8c3225d612327c61e3ce2ac0540e7ca55dbbb8ad4ba0abfb77be7c87e160", 167 | "https://esm.sh/v107/format@0.2.2/deno/format.js": "077174045cfd7230b7bdbdbf53d8f9f9022a2be12e6c8dafb580efe900fe1c01", 168 | "https://esm.sh/v107/hast-util-raw@7.2.3/complex-types.d.ts": "8f91fe1b7888057b7693c49737ea3c75641c53948b2ed139519354af3deac6fe", 169 | "https://esm.sh/v107/hast-util-to-html@8.0.4/deno/hast-util-to-html.js": "3ea6c373ceee43a26ebeb1fe359342ba2e7b5feccb6e7a08aadf528df41a52e1", 170 | "https://esm.sh/v107/hast-util-to-html@8.0.4/index.d.ts": "7d38ef543744aa80cf4f56d6b6225b8b4bc5ee86eb22d5f1f4c96f254914c5aa", 171 | "https://esm.sh/v107/hast-util-to-html@8.0.4/lib/index.d.ts": "054dc51afa9eb7c181ae78a5ce01731dd201bdc3f1379a3197ce1d5ad72f0d84", 172 | "https://esm.sh/v107/hast-util-to-html@8.0.4/lib/types.d.ts": "5738e0a6ede5be60e3ecf27eef6883f136ce1e380dafa3ceaff4822634944b9e", 173 | "https://esm.sh/v107/hast-util-whitespace@2.0.1/deno/hast-util-whitespace.js": "77fe495e0f0f8e1254233a63cd91cde0f45636af1dfc75fdb9e6acfd9b2be52c", 174 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/core.js": "9c844a709235d0e17fb10b95df67dffbf7180c9e722bf144c1539d5759b78e44", 175 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/1c.js": "11097d69a9b82bd13acd01189d9479d719e7849c1e4046c3a57b0dba2ab0b312", 176 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/abnf.js": "bebeb441d056036d5d180ea6a9b4b0ca4929f998b68dc89d85379bb2784b173c", 177 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/accesslog.js": "98c90bdc1cbce94c1d866543cb76ed74aeea37db4c8a922d7a56be4297764979", 178 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/actionscript.js": "106cde29b2663e41a7f4a752ec1887d7969aeea141d108e48e89879137ae4928", 179 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ada.js": "1a04fdaae22e7c6e094b8e46280de5c4b612f47e5f31a87ac4e9546b5135fb0d", 180 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/angelscript.js": "7bef22a0e43f0cbc01a6729c6d28af883f2c24e94e7aa4378c2ed726452cd1e3", 181 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/apache.js": "c46d14569e4f728beb322d306a67f14fc7c2b4740a41a395ba7dcf22390d481e", 182 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/applescript.js": "334ddd0188cdcc7ddb670635a2954ede667ed94d328ccc564956f505ace3e9c2", 183 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/arcade.js": "f4edddd3f1769bd28e8e6c83a09ed072e9d86d4b3991ae689ef927dec1c367c1", 184 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/arduino.js": "e65cc064f9a09de779a35ce20aa457c6d3999b34d8f4517596e1b65d0e3f4b0e", 185 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/armasm.js": "6e794640b86cf233ea1f32185cc6bf32a397c389d8fdbd8896d752fc9073db36", 186 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/asciidoc.js": "7669c42f44df753cb585f69f67a9ebd497dfc4bf9a3985dc55ca3e7ff4c277d4", 187 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/aspectj.js": "34a5e8cfdcaed8b6c3be9ba87a61d644b1b0797fd81911064ac7a90326ef12ef", 188 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/autohotkey.js": "e8285b4356437a8ddb02e12b0bf07c598e3d9d7d98f1feed77644983cf34b085", 189 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/autoit.js": "2a24a0dcbf597d8c6a99ba4e2a49971f73d4ef6b96c721f7ba25254d77041f23", 190 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/avrasm.js": "11db4aefcdcbf92c309698f8b249e13c11bfade44ad2453abab71a000155914f", 191 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/awk.js": "dd231dfc71071d4776fc013f430a23dfa3dbbdf14c3ce6a50677281e9177da00", 192 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/axapta.js": "a95e5644207c356da241833971f50fdc468326b4675040820ed6f13254292669", 193 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/bash.js": "1452a1177305b34c3a9747214d12d137db3777c4ac812ca64775eae87740a3b1", 194 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/basic.js": "0c13351f031748b1ae4dcf5d968d3946f7f1e1452d616f39e3dcf76fdf97135c", 195 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/bnf.js": "edd703ca33ba3abf8963aaea3f1647ab326b065ec390a3d41fdb8b20a6a583a0", 196 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/brainfuck.js": "3810cd5ea86d93abfc835ba09153472e7a5b5c870cea55f3e89aa79fe5596b40", 197 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/c.js": "447891fa4e22c0d6c7076f868dd46097bb9918fbabc67cc7976a1f39fe934f87", 198 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/cal.js": "bc59bde44c90371a232fba3a2772052c8878bbffae75c5b1a4b67c0d7b26bdc3", 199 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/capnproto.js": "22724baac6fb5c10808b69b5a0434a22f7ea154e9cb23250f449b0581c3b9065", 200 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ceylon.js": "9ccace1b40028521efb10a010561a4192884ecedd9a159c9a4ad440d44a39b5c", 201 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/clean.js": "e9a81c832b4315d4db32fc43d50e803ff53b8d3437e09d23168c5cd76a71ef2f", 202 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/clojure-repl.js": "67bb57246851a498e597cc1a37e1387d1ec73b30802101b45e21d589b15eb942", 203 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/clojure.js": "7bf32e1812df0720801ec4ce3c4f551032e8a79e1c54a1512763acd55167ea2d", 204 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/cmake.js": "51ccc6a4b9493a2d80aa35b29e0c09aa0807be6061f21cc13f27dd086b6e0c17", 205 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/coffeescript.js": "5fc79d587ae5de0872c1a2eb8c0f006b54a9b6240296df4e9ec366401c4d6a9f", 206 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/coq.js": "44f41be2f2553a787b21e2f123973c3d3674a5acb380a5b1eef562182227d889", 207 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/cos.js": "5dbf8aa103cdde01cf86f2d2f40fbbd6c26d413f9b6de5d5a8ca6c6eb4884d11", 208 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/cpp.js": "014bd1ebb7a35624801d3dd766672dd372640a4636ace9dcac80945e6586d80c", 209 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/crmsh.js": "536fe3ea830ad234f2d3645e98b7f0d7c9fd5e61c15e4dc8a2a2b18f43ba7b1f", 210 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/crystal.js": "c63dfb17408349d4ed140940f37b7d5ac4a7c5e72a0ff6ecd864d5129c5b8c03", 211 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/csharp.js": "ee840886b38dd4382041ed864a55a0533a412e98b277a916c2e0ee9bf0fad889", 212 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/csp.js": "b4b69ab84a6876121508b268a1110db64a4898ba4a46dd1675e1fd4d115b2be2", 213 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/css.js": "b01aecb7f32f1d4368798136cda0d92d4908b6f5f6baca8d7482280851bb52ac", 214 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/d.js": "ab5688649121fece773a5607b6933f14090f487309d2054db2169f1f2220876c", 215 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dart.js": "bbb030c1055ed2b5d59cf90c8386b0f61a8d15e11b6e46029eaefedac6935e41", 216 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/delphi.js": "6b50210361c40dcbd55562e070556fb39ba17cab7fbfca07317fdc6325f3a992", 217 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/diff.js": "4a7947630cd4abb4daee77e87a4b201fcd04d171a52ee82bc6994925aba7c021", 218 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/django.js": "86509b85bfae5494812cf6dfcdffc7ed320f7b7b7dcc41abdd5c03982224b556", 219 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dns.js": "396e4cf8eb5aff55a74abc60fb051ef32c599f39850228be6db989881eb38d90", 220 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dockerfile.js": "ce9be5718044a203fe6a42c080f75514aa42e3b136d887db1b50d315740ba011", 221 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dos.js": "75d00a7d7cb9c970afa6f3cbc8ea2fd308b879c150d29e4a211eee1b000d7d12", 222 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dsconfig.js": "430688a91b5f900b79a60f37ffbf9972a511e36c9500e7cd3db02b00d3c5d6e4", 223 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dts.js": "d1391cf1fd26fbfbab37aa13649293b1649f3a7315ce5d4484fea7c1bc27b62f", 224 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/dust.js": "41c8cfe3da1a03e6cd260015a9aecb1b6c1f4f4294b6667da70e77a832ec3112", 225 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ebnf.js": "92cd0d5b05a14514abfb0c32ea32fd848ebbc3b92e4fc7b572013312cbc1c394", 226 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/elixir.js": "92f2b38d533d6a2dc53576ff0807d2cc6472f5a4050fd53dd76087bb148ef750", 227 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/elm.js": "32f0e42c60ead8ed670ec22345299ccbc365a9d425ba4024c9e9b2760bf7747b", 228 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/erb.js": "cd0c5fa29056a4187b10a1b0e0ef8defcfab43a3b9f8f33f3048deab9f1f2250", 229 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/erlang-repl.js": "0c24aa34271a47c539b9f711119d202bc5094acee7086b962353713c6d481ee1", 230 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/erlang.js": "b0146400cde9b7f6b719df4fdb79c0ce4c0016ab2f4de2e45a641f5406db01ba", 231 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/excel.js": "e9ae010e8ab89d5d01b0390cf144a77cac4dacd61272a3802080e063b7a052a7", 232 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/fix.js": "3436f491aa2ac32d8b2baea75f1ed5e56453e24323679a767f119224371f3cf1", 233 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/flix.js": "1025167ec1df8d18c85b7c3e0cfa562731ef85af38b657c0a88431ba01515809", 234 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/fortran.js": "4010a2843a42cbe487f1df1c43c1c687ec9670894e22a508d93ad712d4790476", 235 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/fsharp.js": "32b64d9d758ff8d70dcdcfc88a2f60c3d9e9424d80747f9cee524ccf5ada2a01", 236 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gams.js": "61aef615990fb227cadd75a040ebb7ca5d533c09413c46ce835a0a54c802254f", 237 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gauss.js": "08c439bf9f1a9c3579e31e7318e0f70286352ffcbccf7808db73bd0574078bc0", 238 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gcode.js": "490a787380f4c54254f1809b42d44e113ab1bf059fad9ff8061c95982d67bfce", 239 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gherkin.js": "cd56918f8ba60298b49056581ea4feca0024b83aaf6e6738b17b8d4ef98c33c8", 240 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/glsl.js": "b53669ea084d13cb3aa1ca0135266761a33a232bf2bb73f5d12d24f50f230cbc", 241 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gml.js": "92f476f1191be1f6714ffb825564d92ee48c864ff107c1c0cbe39fcce5cbffc2", 242 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/go.js": "1feffa957eeb9c422eb07ba0cea3460e5b9caafe777efb05e07bc479d9f312a7", 243 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/golo.js": "64f13221bf2fa80829c719f9118c6bd6db89a7da705cd75653be2c57a2d39e55", 244 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/gradle.js": "a90f007e217aba048ebbf4b786122127fa63ce747bdb399d28d7c738615537d8", 245 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/graphql.js": "1c2847b38287ceac5dd0c196d3a7da3c8c8587b683bbad91870f0c0c2487ddd7", 246 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/groovy.js": "f65d9d118337ddc1611071f04174197f42208806654474693c26ae665be666d6", 247 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/haml.js": "88bb37eeda0ce51e63354aaf1323d7d0519541c5d4d693be6465e8c084b489c2", 248 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/handlebars.js": "7f20196ef06b0d8f8bfb5ab793f738aa8b83fc6c1dcbb16df9a44d5112ac6884", 249 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/haskell.js": "f4107a30f0264a110b9cfc16cd3a304b2f74dbdfb6182b0e09e8824f2c30b57f", 250 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/haxe.js": "7ee87db0a41091d3c8975102d2bb5b69ce3dff2a88d05e0a21b9445b839d12c3", 251 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/hsp.js": "82a214d637e8cec26a2126f8a7ba8c758fea61a812c78d62249a51b5662ef30e", 252 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/http.js": "2eba0e91125cb4b9d4542108fcd5c3f88498ef9f9984cbe15f504d5d22e5d81a", 253 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/hy.js": "d4e5aa1154ba4cbb53a4aa9036e88fa09d7bcd6a9d104a9b1a855e55c7270a4d", 254 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/inform7.js": "97330bfe2ae298fc7c91f4ca8050ac77a029d595817f66e186da4316724739b5", 255 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ini.js": "f43bb937aacec57c42d45c12a031f2f336c0eac0c47a263868b738e09e891b94", 256 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/irpf90.js": "bd7ae29842f4fa8e9319b396810ccedeaf985ae201d81d7432333f8a808d8c24", 257 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/isbl.js": "4a01ace53e33cbbe46b4169db29aa5bdcb324dd1a2c6f5795f264e11788d23f2", 258 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/java.js": "a42287dac0100411dbad31292cf3842dd3e3e877ccbfe607e780278a518b2a09", 259 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/javascript.js": "531b7254da84a2b2d03a4facf9a704e19346c67da72697d15661067a0c5503fa", 260 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/jboss-cli.js": "df25e6c662d98edb9b53ceb96506db3936f95c01f46e9563ae134158866bbafe", 261 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/json.js": "dfb9368bd33c91ebebf95d4992f59d585f32bfb2c7e67c9115c5cbe0af820a4d", 262 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/julia-repl.js": "da0e190d3338b0e4f20db1fb660b4fed3888517841592470ca053005e5678028", 263 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/julia.js": "fe9638c20bf32ddde8f2060e81f508838c352d8f7793388ed7b1b78435f39623", 264 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/kotlin.js": "1b6bf5f6243fbc01d8351c49c11ed2c7569d029f29574a00884d102ea45e761b", 265 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/lasso.js": "94851cf5184d31e45da29c5ddf0db250358f937ba9544f42e3a61589b6dc60bf", 266 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/latex.js": "65b38ff61185ef223c7988ffe9d36a38eda85b35aa65a111edcf90cfdc778d97", 267 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ldif.js": "65cfb757b24e684a10698a6b4e97a6d2ab2f6d4d0dc4c78c4da0308c7ab07530", 268 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/leaf.js": "5fc5a24cd4ba0795f69c1233394a4680a983b448f5b63d181038611110e4fae5", 269 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/less.js": "8842e6c5e78f9134c057c2644c3e4102ec11b0866d40ac42c1b482fb3f92c7be", 270 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/lisp.js": "9cdd2c10b2159ee082f767e9bce22bba12ac7a79d9115cc189cb5d8969beacf1", 271 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/livecodeserver.js": "8249cc30bfb9907f2246b44f63208b5c05315caa1cc5c8377d73fceeeaaf75ff", 272 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/livescript.js": "e729b9bda3cb5bd2ffbb7b6e0cf26fd407eac211a40a701a5485135cda183c7f", 273 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/llvm.js": "2307006f395178660a05740ca05d119aa7cd31996a65f675c95c73308d289a31", 274 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/lsl.js": "5e2309db913327a5e984a95d8440bbc9249e1e9049c8c09cfbc90c73237fb2d1", 275 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/lua.js": "49e5a38d260360eece1125c2ba1b96bb580cb2175d15975bd151f68f79a4ace2", 276 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/makefile.js": "886cdf9bb99b718a2c972b9f09582ba1d834bebd9d6a978f1fdb3103d0d61337", 277 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/markdown.js": "c085d8c331c3ef0058a12d7e0d97e0c9077a08f88e1857f1c34335841f1890ad", 278 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mathematica.js": "dc916a96b224a21483fdc787c2e88221f695595f9e954af43da28dab3d65d806", 279 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/matlab.js": "176e3ea4ebb212c820effe681e7578da53586e72a4c189d3b9bfc48c78abea6d", 280 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/maxima.js": "3fcc4ec4611ea4fe11f4a7a64199862290d36385a1690b141fbd9c6494c409f9", 281 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mel.js": "f3f5253ebf5be57558955f78785c0c26de0dcc75a82a84f5af66832295d0346e", 282 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mercury.js": "7ae129af98751783bc95fe5527c578a39e13c2ef92b1ec10222653f4051604e4", 283 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mipsasm.js": "9f0ea9d421c4258a37956a8dc8c91b47cad732bf5e2b374ac11a6d6aa821fd67", 284 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mizar.js": "c0475b48f3a950cec06c8b6d1fef9ba208cb716b9546f6717931ff32aeb713bd", 285 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/mojolicious.js": "703d955cbb1b218f682a5bd087b60ec56cd9fa8a815422ec71a65326938d86d8", 286 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/monkey.js": "62f24bf5783ba9974a858c726b96ba4b1f9d99e121d189df9d685c24fd8495e5", 287 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/moonscript.js": "ebefc2dc7b53ecc62123e84302938d97a81229314c32a42a624a50a53b462254", 288 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/n1ql.js": "df72ac2095857a7ee8826cb8804af4224314c2366ad07fdf3d78155311e76f5a", 289 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/nestedtext.js": "5502cf94f82e5d25af558ac1572ac6ebe460c45cf78e0fb1980460921d8d664c", 290 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/nginx.js": "a45974ae7941c5e6f2907736ae6c59cb6dc2d4b6192b19a892d1d3ffff7d25b8", 291 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/nim.js": "a6fbdb7023dcdd082c1a8455d30e846e6c23e3642f7f44dda1bb456ee22b74af", 292 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/nix.js": "9350578e6e3bfbbed383fe135f5af0c9264a8c22d9ec100d998b48c0e9d1fa86", 293 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/node-repl.js": "f9d969044b3c0b830aa2b64ccd460480bc25eeba6e8fa022331e008423219d6f", 294 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/nsis.js": "cebec29f9108f60c2a896b478eb268d54b6dba8b02dc18fc2f7f6c744c795714", 295 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/objectivec.js": "6308d72355a0be52f61e57b24f19ba87fe9a0902035717f51853706e6acde523", 296 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ocaml.js": "2eaa81caba2428e1d7bfd3aeb1d75b6cf2bea62485f63a6e0865675377023023", 297 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/openscad.js": "6f3c77311e5bf2233dc323950b04d30c850249260e7b775c9324b173754898a0", 298 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/oxygene.js": "464518d3de2d6b469d039bebc6fdf387bd515e6c19c888b31288e87df9246d3c", 299 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/parser3.js": "375e2f5ae077263a0030b80e9a48e200ad38343075b045ec320c03abf41fd190", 300 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/perl.js": "c3155ba4a19f4cea60c658af33299073a5f83d20af6ac9a5c3898c940ba69f62", 301 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/pf.js": "7096cad9b4b76ef96b513efb98110445538086e92d17b2e6966e69b9a360570a", 302 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/pgsql.js": "c964a9bf9dc6d78d43a705a9274b659fc4d392e5e565e5115adf99520109d54f", 303 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/php-template.js": "dda7c99b010bf2edc52647d0496922c4a7c9167b61ec0620dc8ff0e5ed92ccad", 304 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/php.js": "961d36b20729676daa559918beb134be0a65e4c87ad18c53184c65813cb47c59", 305 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/plaintext.js": "dba0cc960cf9e74aed1ddbf362d1c5ebb4af68f7e90122abd1dd58ed07c78ae0", 306 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/pony.js": "0322d30a0e7745696ff097fe78fe49110b93b4c99c87315e5fd3daeda1df447f", 307 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/powershell.js": "20ba3b24a25737834212ece84d2e5db2c370a65994e55e3160e0ca566be3f3cf", 308 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/processing.js": "e7a7b1556a35adbb5ec877a23887cfe52f33d013f347ffc4791c3e92efbe4dc9", 309 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/profile.js": "989a06f9e674f06c47cfef12d75027b2bc8dc64b0ad1b3a70715ea91c7569db6", 310 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/prolog.js": "10b5adbcdcd3a19bb39bb1f99a126ad0be3856f6cb659671bc5bf790dbfa4cdc", 311 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/properties.js": "f95d6ffd4d3e2e1c02cd538d89a71eaa33ac94d6bc317ddb8c024b45b7acc2f0", 312 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/protobuf.js": "aa7aa1a82fe6e66b8e6d2cd0e5b65154019982386cbe5092475decd9f9c8dede", 313 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/puppet.js": "d6ebb401cd28b0593ebf08a22e075ada26debb47cface4d3d2929158e0087ec0", 314 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/purebasic.js": "0947024ae1acc396008c1ac12524bfea3e2d0e0eed5c4aef17b6a2061a64071d", 315 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/python-repl.js": "c540d56bd76dcc382ba93a83cbfe50c4d0c2e4548f77a2f283a0c69c6cb07294", 316 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/python.js": "3d792df9129e031c475c8f660e0466f3c95077addc9e9add313d624d73e47b50", 317 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/q.js": "fdb72b39039002029b2a669998be6369854dc1883fcfa843eb01c8f18e110adc", 318 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/qml.js": "ca68fb2858859324653e985bfba4d666cff145e84073362b27a545d6266f0be1", 319 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/r.js": "fb5d7a9f3bc1d09f9deb3d11ed2ac89001fe02abdfe0ee640beeb9c3bb523207", 320 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/reasonml.js": "eefc794bb1459b6a277d50f05263565a1c37f6d5d91f582a45ef1eda25e1558e", 321 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/rib.js": "9fb0b7bbb6dc7a28e76dc0b8b35eaf0e9efe1518d68b24b37ccab6aa6e75fc5e", 322 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/roboconf.js": "e1b1fe9b11d1fa06694317ff2562598fe6a6c4a2f14edd6d0e2c3ef01c596912", 323 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/routeros.js": "6027c8f9470d76451b0c97dbc3fb71563e335f8169541e6c10196f2a1edf7c90", 324 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/rsl.js": "4ea39c6e9496f8ffa78ac671fedf07126ea8b61eaaecc935bda4cd2f375e7a61", 325 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ruby.js": "533cd6604b499d48a2c4e05702f3835908519310b9997a35430cc38d48b95f57", 326 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/ruleslanguage.js": "429b2cae8d74d66fa95b815ab363958c8cca3bc54b03e4956e06de8e4d9e1548", 327 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/rust.js": "3ba4d62bdee5ab621790100a2fc4f5e23e16c75587ef1cae5a97ada5f1aea6c8", 328 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/sas.js": "a3286ec6eaa9a7af89b11fd7e7069ef0a41569e8d17e77c26086b520fd55f8b4", 329 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/scala.js": "a971ef5e2c83d5a79c784286b60c1738bb0d510050874bae65a99b61ac03e345", 330 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/scheme.js": "afef84eabc46bbd643ad1c3696445b20328dded3a55c11d40e0d6dd0779e7631", 331 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/scilab.js": "c895a2affa6c4ae41d07662104f014401ebc4b190b758158ab848ee9db859b7a", 332 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/scss.js": "e6f7f4a1c1b36b72ca79c6e2834cc3c9ac3752669983dbd77222459df7201a63", 333 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/shell.js": "245cadc01202459a5aaa4d22cc7aac15dbd9ba62d78636faa914753bd4fa211d", 334 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/smali.js": "e8d7fa835651550348750eb57a8df5cc30afa8232405b9f3ba1e9efbdf039b01", 335 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/smalltalk.js": "884adfa10c0bdbc1cf31c83b2b8a1e845114b9cb0042194fcc037de1b0596b02", 336 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/sml.js": "1cd77c63d1e705b64900a9bc77968c0c936df10813d244d7dd0c52289a9cfc19", 337 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/sqf.js": "960f764e1b0046533712c41ad03b32f673fd2d44a70b4a419b69bc253270d32c", 338 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/sql.js": "b39373e5b2d3fa05cfb7c57ab0f02394b1b789a4ed06e0098f16dfc1d8542e1c", 339 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/stan.js": "9f5a4222e5ef65fd10f7911f031360451df76bba0223942570ce59d61b8f8b42", 340 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/stata.js": "b3cec048a55ee03bff9c01bc48a0d97bb1c1cf69584e461e8b6a2dab78465ac1", 341 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/step21.js": "692b48963b4001a1ff89011ce771f76df45247498145f14ec7723681bdb618d8", 342 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/stylus.js": "d674f781728e269d8831d9a000f0643d0f9ac656fdf6777a01f77aa18c04378b", 343 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/subunit.js": "5bbe365bddd62a1510e59a89fff78571d8be92491443d4a358c1718f574256b8", 344 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/swift.js": "49425c0f32eb900c5be8dab7a00a36bfb98c7b7b6f770755e8db83de7d1d0543", 345 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/taggerscript.js": "1ec7826a138fec1ad64d616838cbf06d22f1ca591e4b40d66b9560ffb314e4d9", 346 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/tap.js": "ade642a71ae3ba420125670ca01ba0d5f09d273719e7ffc7705e4e67d0a461bb", 347 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/tcl.js": "142f85790ba02a5d00d12403ac6edf4687fa0150edc50696a45c1a894baec92e", 348 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/thrift.js": "8fb8e035eba7636592cd711b1952c224d42429fb9ae815b38caa076b315761ea", 349 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/tp.js": "241c57967ee1aac5913371fe02992ce13330055a35f0be9877cad87a7e6cf8e1", 350 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/twig.js": "3033e68f3a744c7631e40cbd1604d871bb440b1b9ac916530b86a0d2b8c2d5bb", 351 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/typescript.js": "08c7a5feee4c1ea64efa8da2096825f87371738dd88b2b4b34cdfdb273b19ffc", 352 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vala.js": "04140237bb0fa62b7c5885b01d81b171b66f2ba62dec9a005607c4ee8d8d520d", 353 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vbnet.js": "16bc64cd67968eedf20a6a7da40393ec7a2f65fa2dcbb8c0920bbabf927173e9", 354 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vbscript-html.js": "a3f7c9ff7fe18e5f82d2708a554dbc92407c0ff67c87f5cd860bcf7dc11e08c8", 355 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vbscript.js": "87d864dc987578f5612f5865bde38b32e67aa5305a46a0aa15f8e3258ec3d98f", 356 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/verilog.js": "7bd94f02ae968a0759388c61a84d6fec1a565d83f9f6ffa1a97ad6dca1047471", 357 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vhdl.js": "bb9707d07fd3cccb86195e962d85400538541c004869d2d5be80a619d3fd0833", 358 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/vim.js": "54a5a8af0d30c2fd1deb23fbe3e27ae130f34740e6b0f3df6a0393eb2752b039", 359 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/wasm.js": "5b67c9c6e0c146136dca14dc55b7159643c5030581e106ef255ca1a500053bb7", 360 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/wren.js": "6d088e67e25c4d7c41c18c5f4a2b5d1e39804753240795361aae93e8b7054810", 361 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/x86asm.js": "77af1ece66b6449338a5bf84e6adafef0ecbc576b710dafe02e2a05be478b569", 362 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/xl.js": "99b470070ab4bc6b290cbec28e5e6fea514da2c741b4d00a40d6d36650d11c1d", 363 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/xml.js": "d197f6d4336f5f9e7b5ed0e347fc1e47e272231d3f813ad2a1becd58ffc53025", 364 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/xquery.js": "793ab306f71ea62777eb3cc4fac8ea9fc7b8d55a993777f35860e7270a70eb9a", 365 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/yaml.js": "5bd5e239ed077b36dbed95abcb73725b2050c83063de18fd950dd4b99236f766", 366 | "https://esm.sh/v107/highlight.js@11.7.0/deno/lib/languages/zephir.js": "7bc1618ea7c15d44f5ae8a482cf64d2cfa0f3ca0396ba470e89f011002ef8803", 367 | "https://esm.sh/v107/highlight.js@11.7.0/types/index.d.ts": "e70dd5f565b1e3ae1e7bf24d5419ca2c89fae3ae4bff8cb7fb90470dbcbc9229", 368 | "https://esm.sh/v107/html-void-elements@2.0.1/deno/html-void-elements.js": "a631be03a1e522cb18c9960054fce0dd299635528ca44c0f1f63da0b07dbee32", 369 | "https://esm.sh/v107/lowlight@2.8.1/deno/lib/all.js": "447dbb6cbd4a08a6985f1d58640fb1ee96f93637b537261b6f51dd89346668e0", 370 | "https://esm.sh/v107/lowlight@2.8.1/deno/lib/common.js": "e9341e6f250585f589609ff73c89adeadd6d0b9fd3adf28626a0c82299177662", 371 | "https://esm.sh/v107/lowlight@2.8.1/deno/lib/core.js": "85d8f4aa90a80c2ce0369b31b313379d0904f7dc5674cc26f2982f7adecc2726", 372 | "https://esm.sh/v107/lowlight@2.8.1/lib/all.d.ts": "8c25ab65c1d38c1b274330636fcea8d3f455f44b53a12171651ec8b220d5af5e", 373 | "https://esm.sh/v107/lowlight@2.8.1/lib/common.d.ts": "790c454f49829da352840cca5ec2c0bdc5a97e8a27622105b1f3c31221dad015", 374 | "https://esm.sh/v107/lowlight@2.8.1/lib/core.d.ts": "ffb1c3271a43f5756fd7d97095b5eec6fba306fec08e5c0e320c28c79895e9ac", 375 | "https://esm.sh/v107/property-information@6.2.0/deno/property-information.js": "4ded0b8f927dd66d3eb4f996b50d2231a450f983ce1404b37f97ba959128a810", 376 | "https://esm.sh/v107/property-information@6.2.0/index.d.ts": "a9e5c5ec2c2f725d3076d5723936f9421b61aad61c70761a046887e78205faff", 377 | "https://esm.sh/v107/property-information@6.2.0/lib/find.d.ts": "946fb56407dd8761cb61b1670a6c7df7e12bd5ec4b543b23c627d6ed94d7ce6f", 378 | "https://esm.sh/v107/property-information@6.2.0/lib/hast-to-react.d.ts": "46ab5ea5cdbc0ce75ade44ec0d9aa164f81e42b061d8e573b832a73ed181da57", 379 | "https://esm.sh/v107/property-information@6.2.0/lib/normalize.d.ts": "d752d4dde165ab9bd56ddd111f59a6bf46eebbc6d4ba4e433f2ea21d1d0599e6", 380 | "https://esm.sh/v107/property-information@6.2.0/lib/util/info.d.ts": "7bd32cd2e05737c6a5041ca7a31ceca0c14ce065661c5d1ae5f7bfa35ff3fc5e", 381 | "https://esm.sh/v107/property-information@6.2.0/lib/util/schema.d.ts": "35fc1ace1046f537efd2a4f06cf58149465ccca6bc1045ee0bd27e58fcd53804", 382 | "https://esm.sh/v107/space-separated-tokens@2.0.2/deno/space-separated-tokens.js": "1107a4be51a2095d72009ec11725e381f8564b0e8c8d43b2f5cc98416800ba92", 383 | "https://esm.sh/v107/stringify-entities@4.0.3/deno/stringify-entities.js": "9b875c17d476d23c2c9f3f6c56bd465c22608bc3af1955ac8ba7bc2bc8bbe7a5", 384 | "https://esm.sh/v107/stringify-entities@4.0.3/index.d.ts": "0bf3069ff807079ea3146c99567dc35808a0bb7f13e09fa8669b7260f9380152", 385 | "https://esm.sh/v107/stringify-entities@4.0.3/lib/core.d.ts": "0031b32fbaefc85371847aae06de5f4f180e9ef6d15d20337df9263bfa89e1e4", 386 | "https://esm.sh/v107/stringify-entities@4.0.3/lib/index.d.ts": "3e1fd20a36aa18e287ff92fba23023cad2a2b6f8472586aa652b3c1ba86c4c3c", 387 | "https://esm.sh/v107/stringify-entities@4.0.3/lib/util/format-smart.d.ts": "c19d7ac12ed3eba32c4a5de206abad95aff3076b9fca167964c0962796fa2ac7", 388 | "https://esm.sh/v107/zwitch@2.0.4/deno/zwitch.js": "bc32faa69a49c4f1988445477c640d459a9936ba625d1aae21ca4cda529a767c" 389 | } 390 | } 391 | -------------------------------------------------------------------------------- /deps_dev.ts: -------------------------------------------------------------------------------- 1 | export { serve } from "https://deno.land/std@0.192.0/http/server.ts"; 2 | export { pooledMap } from "https://deno.land/std@0.192.0/async/pool.ts"; 3 | import { Octokit as OctokitCore } from "https://cdn.skypack.dev/@octokit/core@4.2.0?dts"; 4 | import { restEndpointMethods } from "https://cdn.skypack.dev/@octokit/plugin-rest-endpoint-methods@7.0.1?dts"; 5 | 6 | export const Octokit = OctokitCore.plugin(restEndpointMethods); 7 | -------------------------------------------------------------------------------- /dev_server.ts: -------------------------------------------------------------------------------- 1 | import { serve } from "./deps_dev.ts"; 2 | import handle from "./api/main.ts"; 3 | 4 | await serve(async (req) => { 5 | return (await handle(req))!; 6 | }, { port: 8080 }); 7 | -------------------------------------------------------------------------------- /generateThemeJson.ts: -------------------------------------------------------------------------------- 1 | import { Octokit, pooledMap } from "./deps_dev.ts"; 2 | 3 | const ref = "11.7.0"; 4 | const owner = "highlightjs"; 5 | const repo = "highlight.js"; 6 | 7 | const octkit = new Octokit(); 8 | 9 | const path = "src/styles"; 10 | const { data } = await octkit.rest.repos.getContent({ owner, repo, ref, path }); 11 | 12 | if (!Array.isArray(data)) { 13 | throw Error( 14 | `https://github.com/${owner}/${repo}/tree/${ref}/${path} must have multiple files`, 15 | ); 16 | } 17 | 18 | const { data: base16 } = await octkit.rest.repos.getContent({ 19 | owner, 20 | repo, 21 | ref, 22 | path: `${path}/base16`, 23 | }); 24 | if (!Array.isArray(base16)) { 25 | throw Error( 26 | `https://github.com/${owner}/${repo}/tree/${ref}/${path}/base16 must have multiple files`, 27 | ); 28 | } 29 | 30 | const themeMap: Record = {}; 31 | for await ( 32 | const filename of pooledMap( 33 | 4, 34 | [...data, ...base16], 35 | async (file) => { 36 | if (file.type !== "file") return; 37 | if (!file.name.endsWith(".css")) return; 38 | if (!file.download_url) return; 39 | 40 | const key = file.name.slice(0, -4); 41 | if (Object.hasOwn(themeMap, key)) return; 42 | 43 | const res = await fetch(file.download_url); 44 | const content = await res.text(); 45 | themeMap[key] = content; 46 | 47 | return file.name; 48 | }, 49 | ) 50 | ) { 51 | if (!filename) continue; 52 | console.log(`Download ${filename}`); 53 | } 54 | 55 | await Deno.writeTextFile( 56 | new URL("./src/theme.json", import.meta.url), 57 | JSON.stringify(themeMap), 58 | ); 59 | -------------------------------------------------------------------------------- /src/deps.ts: -------------------------------------------------------------------------------- 1 | export { 2 | bold, 3 | cyan, 4 | gray, 5 | green, 6 | red, 7 | yellow, 8 | } from "https://deno.land/std@0.192.0/fmt/colors.ts"; 9 | 10 | export { 11 | Application, 12 | Context, 13 | createHttpError, 14 | isHttpError, 15 | type Middleware, 16 | Router, 17 | type RouterContext, 18 | type RouterMiddleware, 19 | Status, 20 | STATUS_TEXT, 21 | } from "https://deno.land/x/oak@v12.5.0/mod.ts"; 22 | 23 | import type { lowlight } from "https://esm.sh/lowlight@2.9.0/lib/all.js"; 24 | export { lowlight } from "https://esm.sh/lowlight@2.9.0/lib/all.js"; 25 | export type Root = ReturnType; 26 | export type { 27 | Comment, 28 | Element, 29 | ElementContent, 30 | Text, 31 | } from "https://esm.sh/v106/@types/hast@2.3.4/index.d.ts"; 32 | export { toHtml } from "https://esm.sh/hast-util-to-html@8.0.4"; 33 | -------------------------------------------------------------------------------- /src/handleErrors.ts: -------------------------------------------------------------------------------- 1 | // based on https://github.com/denoland/docland/blob/5fc93d458c59a5ddec9deb06e51dfb32ffdc4b7f/middleware/errors.tsx 2 | /** @jsx h */ 3 | import { 4 | Context, 5 | isHttpError, 6 | Middleware, 7 | Status, 8 | STATUS_TEXT, 9 | } from "./deps.ts"; 10 | 11 | export const handleErrors: Middleware = async (ctx, next) => { 12 | try { 13 | await next(); 14 | } catch (err) { 15 | const accepts = ctx.request.accepts("text/html", "application/json"); 16 | if (isHttpError(err)) { 17 | setResponse(ctx, accepts, err.status, err.message); 18 | if (err.expose) { 19 | return; 20 | } 21 | } else if (err instanceof Error) { 22 | setResponse(ctx, accepts, Status.InternalServerError, err.message); 23 | } else { 24 | setResponse( 25 | ctx, 26 | accepts, 27 | Status.InternalServerError, 28 | "[non-error-thrown]", 29 | ); 30 | } 31 | throw err; 32 | } 33 | }; 34 | 35 | const setResponse = ( 36 | ctx: Context, 37 | accepts: string | undefined, 38 | status: Status, 39 | message: string, 40 | ) => { 41 | const statusText = `${status} ${STATUS_TEXT[status]}`; 42 | ctx.response.status = status; 43 | if (accepts === "text/html") { 44 | ctx.response.body = 45 | `${statusText}

${statusText}

${message}`; 46 | ctx.response.type = "html"; 47 | } else if (accepts === "application/json") { 48 | ctx.response.body = { status, text: STATUS_TEXT[status], message }; 49 | ctx.response.type = "json"; 50 | } else { 51 | ctx.response.body = `Error: [${statusText}] ${message}`; 52 | ctx.response.type = "text/plain"; 53 | } 54 | }; 55 | -------------------------------------------------------------------------------- /src/handleNotFound.ts: -------------------------------------------------------------------------------- 1 | import { Middleware, Status } from "./deps.ts"; 2 | export const handleNotFound: Middleware = async (context, next) => { 3 | await next(); 4 | if (context.response.status !== Status.NotFound) return; 5 | if (context.request.accepts("application/json")) { 6 | context.response.status = Status.NotFound; 7 | context.response.type = "json"; 8 | context.response.body = { 9 | name: "NotFoundError", 10 | url: context.request.url, 11 | }; 12 | } else if (context.request.accepts("text/html")) { 13 | context.response.status = Status.NotFound; 14 | context.response.body = 15 | `404 - Not Found

404 - Not Found

Path ${context.request.url} not found.`; 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/logging.ts: -------------------------------------------------------------------------------- 1 | // ported from https://github.com/denoland/docland/blob/5fc93d458c59a5ddec9deb06e51dfb32ffdc4b7f/middleware/logging.ts 2 | import { bold, cyan, gray, green, Middleware, red, yellow } from "./deps.ts"; 3 | 4 | export const logging: Middleware = async (ctx, next) => { 5 | await next(); 6 | const rt = ctx.response.headers.get("X-Response-Time"); 7 | const c = ctx.response.status >= 500 8 | ? red 9 | : ctx.response.status >= 400 10 | ? yellow 11 | : green; 12 | console.log( 13 | `${c(ctx.request.method)} ${gray(`(${ctx.response.status})`)} - ${ 14 | cyan(`${ctx.request.url.pathname}${ctx.request.url.search}`) 15 | } - ${bold(String(rt))}`, 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /src/parseParams.ts: -------------------------------------------------------------------------------- 1 | import { RouterContext } from "./deps.ts"; 2 | import { parseSVGLength, SVGLength } from "./svgLength.ts"; 3 | 4 | export interface Params { 5 | url: string; 6 | range?: [number, number]; 7 | language?: string; 8 | lightTheme?: string; 9 | darkTheme?: string; 10 | nowrap: boolean; 11 | fontSize?: SVGLength; 12 | width?: SVGLength; 13 | blanks?: number; 14 | } 15 | 16 | export const parseParams = ( 17 | params: RouterContext< 18 | "/svg/:options?/:proto(http:/|https:/)/:host/:path?" 19 | >["params"], 20 | ): Params => { 21 | const { options = "", proto, host, path } = params; 22 | const parsed: Params = { 23 | url: `${proto}/${host}${path ? `/${path}` : ""}`, 24 | nowrap: false, 25 | }; 26 | for (const option of options.split(",").map((option) => option.trim())) { 27 | if (option.includes("=")) { 28 | const [key, value] = option.split("=", 2); 29 | if (!value) continue; 30 | switch (key) { 31 | case "lang": 32 | parsed.language ??= value; 33 | break; 34 | case "light": 35 | parsed.lightTheme ??= value; 36 | break; 37 | case "dark": 38 | parsed.darkTheme ??= value; 39 | break; 40 | case "fontSize": 41 | parsed.fontSize ??= parseSVGLength(value); 42 | break; 43 | case "width": 44 | parsed.width ??= parseSVGLength(value); 45 | break; 46 | case "blanks": 47 | if (/^\d+$/.test(value)) parsed.blanks ??= parseInt(value); 48 | break; 49 | default: 50 | break; 51 | } 52 | } 53 | if (option === "nowrap") parsed.nowrap = true; 54 | { 55 | const range = option.match(/^L(\d+)(?:-(\d+))?$/)?.slice?.(1); 56 | if (range) { 57 | const start = parseInt(range[0]); 58 | const end = parseInt(range[1] ?? range[0]); 59 | // 1始まりを0始まりに直す 60 | parsed.range ??= [start - 1, end - 1]; 61 | continue; 62 | } 63 | } 64 | } 65 | parsed.language ??= parsed.url.match(/\.(\w+)$/)?.[1]; 66 | return parsed; 67 | }; 68 | -------------------------------------------------------------------------------- /src/slice.ts: -------------------------------------------------------------------------------- 1 | /** iterator版slice */ 2 | export const slice = ( 3 | start: number, 4 | end: number, 5 | list: Iterable, 6 | ): T[] => { 7 | const [s, e] = start < end ? [start, end] : [end, start]; 8 | let counter = 0; 9 | const sliced: T[] = []; 10 | for (const value of list) { 11 | if (s <= counter) sliced.push(value); 12 | if (e <= counter) break; 13 | counter++; 14 | } 15 | return sliced; 16 | }; 17 | -------------------------------------------------------------------------------- /src/splitNode.ts: -------------------------------------------------------------------------------- 1 | import { Comment, Element, ElementContent, Root, Text } from "./deps.ts"; 2 | 3 | /** 与えられたhastを1行ごとに分割する 4 | * 5 | * @param node 分割したいhast 6 | * @return 分割したhastを1行ずつ返す 7 | */ 8 | export function* splitNode( 9 | node: Root | ElementContent, 10 | ): Generator { 11 | switch (node.type) { 12 | case "root": 13 | yield* splitNode({ 14 | type: "element", 15 | tagName: "div", 16 | children: node.children, 17 | }); 18 | return; 19 | case "comment": 20 | case "text": 21 | for ( 22 | const textNode of node.value.split("\n").map( 23 | (value) => ({ type: node.type, value }), 24 | ) 25 | ) { 26 | yield textNode; 27 | } 28 | return; 29 | case "element": { 30 | if (node.children.length === 0) { 31 | yield node; 32 | return; 33 | } 34 | let prev: Element | undefined; 35 | const { children, ...rest } = node; 36 | for (const child of children) { 37 | let counter = 0; 38 | for (const splitted of splitNode(child)) { 39 | if (prev && counter > 0) { 40 | if (prev.children.length === 0) prev.children.push(breakLine); 41 | yield prev; 42 | prev = undefined; 43 | } 44 | counter++; 45 | const isEmpty = isEmptyNode(splitted); 46 | if (prev) { 47 | if (isEmpty) continue; 48 | prev.children.push(splitted); 49 | continue; 50 | } 51 | prev = { ...rest, children: isEmpty ? [] : [splitted] }; 52 | } 53 | } 54 | if (prev) { 55 | if (prev.children.length === 0) prev.children.push(breakLine); 56 | yield prev; 57 | } 58 | return; 59 | } 60 | } 61 | } 62 | 63 | /** 空文字のnodeなら`false`を返す */ 64 | const isEmptyNode = (node: ElementContent): node is Text | Comment => 65 | (node.type === "text" || node.type === "comment") && node.value === ""; 66 | 67 | const breakLine: Element = { type: "element", tagName: "br", children: [] }; 68 | -------------------------------------------------------------------------------- /src/svgGet.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createHttpError, 3 | lowlight, 4 | RouterMiddleware, 5 | Status, 6 | toHtml, 7 | } from "./deps.ts"; 8 | import { splitNode } from "./splitNode.ts"; 9 | import { slice } from "./slice.ts"; 10 | import { parseParams } from "./parseParams.ts"; 11 | import themes from "./theme.json" assert { type: "json" }; 12 | 13 | /** fontの幅/高さ */ 14 | const fontSizeRatio = 0.55; 15 | const lineHeight = 1.2; 16 | export const svgGet: RouterMiddleware< 17 | "/svg/:options?/:proto(http:/?|https:/?)/:host/:path(.*)?" 18 | > = async (context) => { 19 | const { 20 | url, 21 | range = [0, Infinity], 22 | fontSize = { length: 1, unit: "em" }, 23 | width: width_, 24 | lightTheme, 25 | darkTheme, 26 | language, 27 | nowrap, 28 | blanks = 0, 29 | } = parseParams( 30 | context.params, 31 | ); 32 | const res = await fetch(url); 33 | if (!res.ok) { 34 | throw createHttpError(res.status, `Failed to fetch ${url}`, { 35 | headers: res.headers, 36 | }); 37 | } 38 | const text = await res.text(); 39 | 40 | const tree = language && lowlight.registered(language) 41 | ? lowlight.highlight(language, text) 42 | : lowlight.highlightAuto(text); 43 | const [start, end] = range.map((l) => Math.max(0, l)); 44 | const snippet = slice(start, end, splitNode(tree)); 45 | const maxLineChars = Math.max( 46 | ...text.split("\n").slice(start, end + 1).map((line) => line.length), 47 | ); 48 | const height = `${ 49 | ((snippet.length + blanks) * lineHeight) * fontSize.length 50 | }${fontSize.unit}`; 51 | const width: string = width_ 52 | ? `${width_.length}${width_.unit}` 53 | : `${maxLineChars * fontSize.length * fontSizeRatio}${fontSize.unit}`; 54 | 55 | const light = isTheme(lightTheme) ? lightTheme : "github"; 56 | const lightCSS = themes[light] ?? themes.github; 57 | const dark = isTheme(darkTheme) ? darkTheme : "github-dark"; 58 | const darkCSS = themes[dark] ?? themes["github-dark"]; 59 | 60 | context.response.status = Status.OK; 61 | context.response.type = "image/svg+xml"; 62 | context.response.headers.set( 63 | "expires", 64 | res.headers.get("expires") ?? 65 | new Date(Date.now() + 86_400).toUTCString(), 66 | ); 67 | context.response.body = ` 68 | 69 | 70 | 71 | 72 | 79 | 80 | 81 |
${
82 |     toHtml(snippet, {
83 |       closeEmptyElements: true,
84 |       closeSelfClosing: true,
85 |     })
86 |   }
87 |
`; 88 | }; 89 | 90 | const isTheme = (theme: string | undefined): theme is keyof typeof themes => 91 | Object.hasOwn(themes, theme ?? ""); 92 | -------------------------------------------------------------------------------- /src/svgLength.test.ts: -------------------------------------------------------------------------------- 1 | import { parseSVGLength } from "./svgLength.ts"; 2 | import { assertEquals } from "https://deno.land/std@0.177.0/testing/asserts.ts"; 3 | 4 | Deno.test("parseSVGLength()", async (t) => { 5 | await t.step("must pass", async (t) => { 6 | const units = [ 7 | "em", 8 | "ex", 9 | "px", 10 | "in", 11 | "cm", 12 | "mm", 13 | "pt", 14 | "pc", 15 | "%", 16 | "", 17 | ] as const; 18 | for (const unit of units) { 19 | for (const length of ["400", "40.0", ".43", "40."]) { 20 | const str = `${length}${unit}`; 21 | await t.step(str, () => { 22 | assertEquals(parseSVGLength(str), { 23 | length: parseFloat(length), 24 | unit: unit || "px", 25 | }); 26 | }); 27 | } 28 | } 29 | }); 30 | 31 | await t.step("cannot pass", () => { 32 | assertEquals(parseSVGLength("500ch"), undefined); 33 | assertEquals(parseSVGLength("hello"), undefined); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/svgLength.ts: -------------------------------------------------------------------------------- 1 | export type SVGLengthUnit = 2 | | "em" 3 | | "ex" 4 | | "px" 5 | | "in" 6 | | "cm" 7 | | "mm" 8 | | "pt" 9 | | "pc" 10 | | "%"; 11 | export interface SVGLength { 12 | length: number; 13 | unit: SVGLengthUnit; 14 | } 15 | 16 | /** parseに失敗したら`undefined`を返す */ 17 | export const parseSVGLength = ( 18 | length: number | string, 19 | ): SVGLength | undefined => { 20 | if (typeof length === "number") return { length, unit: "px" }; 21 | const num = parseFloat(length); 22 | if (isNaN(num)) return; 23 | if (/^(?:\d+\.?\d*|\.\d+)$/.test(length)) return { length: num, unit: "px" }; 24 | const [, unit] = length.match(/(em|ex|px|in|cm|mm|pt|pc|%)$/) ?? []; 25 | if (unit === undefined) return; 26 | return { length: num, unit: unit as SVGLengthUnit }; 27 | }; 28 | -------------------------------------------------------------------------------- /src/timing.ts: -------------------------------------------------------------------------------- 1 | // ported from https://github.com/denoland/docland/blob/5fc93d458c59a5ddec9deb06e51dfb32ffdc4b7f/middleware/logging.ts 2 | import { Middleware } from "./deps.ts"; 3 | 4 | export const timing: Middleware = async (ctx, next) => { 5 | const start = Date.now(); 6 | await next(); 7 | const ms = Date.now() - start; 8 | ctx.response.headers.set("X-Response-Time", `${ms}ms`); 9 | }; 10 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "functions": { 3 | "api/**/*.[jt]s": { "runtime": "vercel-deno@2.0.3" } 4 | }, 5 | "rewrites": [{ "source": "/(.*)", "destination": "/api/main" }] 6 | } 7 | --------------------------------------------------------------------------------