atproto pastebin service: https://plonk.li

add server sided code highlighting from shiki

authored by nekomimi.pet and committed by Tangled 5bb9d4dc a717f070

+523
package-lock.json
··· 26 26 "multiformats": "^9.9.0", 27 27 "pino": "^9.3.2", 28 28 "pug": "^3.0.3", 29 + "shiki": "^3.4.2", 29 30 "uhtml": "^4.5.9" 30 31 }, 31 32 "devDependencies": { ··· 1484 1485 "win32" 1485 1486 ] 1486 1487 }, 1488 + "node_modules/@shikijs/core": { 1489 + "version": "3.4.2", 1490 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.4.2.tgz", 1491 + "integrity": "sha512-AG8vnSi1W2pbgR2B911EfGqtLE9c4hQBYkv/x7Z+Kt0VxhgQKcW7UNDVYsu9YxwV6u+OJrvdJrMq6DNWoBjihQ==", 1492 + "license": "MIT", 1493 + "dependencies": { 1494 + "@shikijs/types": "3.4.2", 1495 + "@shikijs/vscode-textmate": "^10.0.2", 1496 + "@types/hast": "^3.0.4", 1497 + "hast-util-to-html": "^9.0.5" 1498 + } 1499 + }, 1500 + "node_modules/@shikijs/engine-javascript": { 1501 + "version": "3.4.2", 1502 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.4.2.tgz", 1503 + "integrity": "sha512-1/adJbSMBOkpScCE/SB6XkjJU17ANln3Wky7lOmrnpl+zBdQ1qXUJg2GXTYVHRq+2j3hd1DesmElTXYDgtfSOQ==", 1504 + "license": "MIT", 1505 + "dependencies": { 1506 + "@shikijs/types": "3.4.2", 1507 + "@shikijs/vscode-textmate": "^10.0.2", 1508 + "oniguruma-to-es": "^4.3.3" 1509 + } 1510 + }, 1511 + "node_modules/@shikijs/engine-oniguruma": { 1512 + "version": "3.4.2", 1513 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.4.2.tgz", 1514 + "integrity": "sha512-zcZKMnNndgRa3ORja6Iemsr3DrLtkX3cAF7lTJkdMB6v9alhlBsX9uNiCpqofNrXOvpA3h6lHcLJxgCIhVOU5Q==", 1515 + "license": "MIT", 1516 + "dependencies": { 1517 + "@shikijs/types": "3.4.2", 1518 + "@shikijs/vscode-textmate": "^10.0.2" 1519 + } 1520 + }, 1521 + "node_modules/@shikijs/langs": { 1522 + "version": "3.4.2", 1523 + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.4.2.tgz", 1524 + "integrity": "sha512-H6azIAM+OXD98yztIfs/KH5H4PU39t+SREhmM8LaNXyUrqj2mx+zVkr8MWYqjceSjDw9I1jawm1WdFqU806rMA==", 1525 + "license": "MIT", 1526 + "dependencies": { 1527 + "@shikijs/types": "3.4.2" 1528 + } 1529 + }, 1530 + "node_modules/@shikijs/themes": { 1531 + "version": "3.4.2", 1532 + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.4.2.tgz", 1533 + "integrity": "sha512-qAEuAQh+brd8Jyej2UDDf+b4V2g1Rm8aBIdvt32XhDPrHvDkEnpb7Kzc9hSuHUxz0Iuflmq7elaDuQAP9bHIhg==", 1534 + "license": "MIT", 1535 + "dependencies": { 1536 + "@shikijs/types": "3.4.2" 1537 + } 1538 + }, 1539 + "node_modules/@shikijs/types": { 1540 + "version": "3.4.2", 1541 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.4.2.tgz", 1542 + "integrity": "sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg==", 1543 + "license": "MIT", 1544 + "dependencies": { 1545 + "@shikijs/vscode-textmate": "^10.0.2", 1546 + "@types/hast": "^3.0.4" 1547 + } 1548 + }, 1549 + "node_modules/@shikijs/vscode-textmate": { 1550 + "version": "10.0.2", 1551 + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", 1552 + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", 1553 + "license": "MIT" 1554 + }, 1487 1555 "node_modules/@ts-morph/common": { 1488 1556 "version": "0.17.0", 1489 1557 "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", ··· 1602 1670 "@types/send": "*" 1603 1671 } 1604 1672 }, 1673 + "node_modules/@types/hast": { 1674 + "version": "3.0.4", 1675 + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", 1676 + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", 1677 + "license": "MIT", 1678 + "dependencies": { 1679 + "@types/unist": "*" 1680 + } 1681 + }, 1605 1682 "node_modules/@types/http-errors": { 1606 1683 "version": "2.0.4", 1607 1684 "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 1608 1685 "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", 1609 1686 "dev": true, 1610 1687 "license": "MIT" 1688 + }, 1689 + "node_modules/@types/mdast": { 1690 + "version": "4.0.4", 1691 + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", 1692 + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", 1693 + "license": "MIT", 1694 + "dependencies": { 1695 + "@types/unist": "*" 1696 + } 1611 1697 }, 1612 1698 "node_modules/@types/mime": { 1613 1699 "version": "1.3.5", ··· 1662 1748 "@types/node": "*", 1663 1749 "@types/send": "*" 1664 1750 } 1751 + }, 1752 + "node_modules/@types/unist": { 1753 + "version": "3.0.3", 1754 + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", 1755 + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", 1756 + "license": "MIT" 1757 + }, 1758 + "node_modules/@ungap/structured-clone": { 1759 + "version": "1.3.0", 1760 + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 1761 + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 1762 + "license": "ISC" 1665 1763 }, 1666 1764 "node_modules/@webreflection/signal": { 1667 1765 "version": "2.1.2", ··· 2095 2193 "cborg": "cli.js" 2096 2194 } 2097 2195 }, 2196 + "node_modules/ccount": { 2197 + "version": "2.0.1", 2198 + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", 2199 + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", 2200 + "license": "MIT", 2201 + "funding": { 2202 + "type": "github", 2203 + "url": "https://github.com/sponsors/wooorm" 2204 + } 2205 + }, 2098 2206 "node_modules/chalk": { 2099 2207 "version": "4.1.2", 2100 2208 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", ··· 2110 2218 }, 2111 2219 "funding": { 2112 2220 "url": "https://github.com/chalk/chalk?sponsor=1" 2221 + } 2222 + }, 2223 + "node_modules/character-entities-html4": { 2224 + "version": "2.1.0", 2225 + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", 2226 + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", 2227 + "license": "MIT", 2228 + "funding": { 2229 + "type": "github", 2230 + "url": "https://github.com/sponsors/wooorm" 2231 + } 2232 + }, 2233 + "node_modules/character-entities-legacy": { 2234 + "version": "3.0.0", 2235 + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", 2236 + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", 2237 + "license": "MIT", 2238 + "funding": { 2239 + "type": "github", 2240 + "url": "https://github.com/sponsors/wooorm" 2113 2241 } 2114 2242 }, 2115 2243 "node_modules/character-parser": { ··· 2189 2317 "node": ">= 0.8" 2190 2318 } 2191 2319 }, 2320 + "node_modules/comma-separated-tokens": { 2321 + "version": "2.0.3", 2322 + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", 2323 + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", 2324 + "license": "MIT", 2325 + "funding": { 2326 + "type": "github", 2327 + "url": "https://github.com/sponsors/wooorm" 2328 + } 2329 + }, 2192 2330 "node_modules/commander": { 2193 2331 "version": "9.5.0", 2194 2332 "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", ··· 2361 2499 "node": ">= 0.8" 2362 2500 } 2363 2501 }, 2502 + "node_modules/dequal": { 2503 + "version": "2.0.3", 2504 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 2505 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 2506 + "license": "MIT", 2507 + "engines": { 2508 + "node": ">=6" 2509 + } 2510 + }, 2364 2511 "node_modules/destroy": { 2365 2512 "version": "1.2.0", 2366 2513 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", ··· 2378 2525 "license": "Apache-2.0", 2379 2526 "engines": { 2380 2527 "node": ">=8" 2528 + } 2529 + }, 2530 + "node_modules/devlop": { 2531 + "version": "1.1.0", 2532 + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", 2533 + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 2534 + "license": "MIT", 2535 + "dependencies": { 2536 + "dequal": "^2.0.0" 2537 + }, 2538 + "funding": { 2539 + "type": "github", 2540 + "url": "https://github.com/sponsors/wooorm" 2381 2541 } 2382 2542 }, 2383 2543 "node_modules/diff": { ··· 3043 3203 "node": ">= 0.4" 3044 3204 } 3045 3205 }, 3206 + "node_modules/hast-util-to-html": { 3207 + "version": "9.0.5", 3208 + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", 3209 + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", 3210 + "license": "MIT", 3211 + "dependencies": { 3212 + "@types/hast": "^3.0.0", 3213 + "@types/unist": "^3.0.0", 3214 + "ccount": "^2.0.0", 3215 + "comma-separated-tokens": "^2.0.0", 3216 + "hast-util-whitespace": "^3.0.0", 3217 + "html-void-elements": "^3.0.0", 3218 + "mdast-util-to-hast": "^13.0.0", 3219 + "property-information": "^7.0.0", 3220 + "space-separated-tokens": "^2.0.0", 3221 + "stringify-entities": "^4.0.0", 3222 + "zwitch": "^2.0.4" 3223 + }, 3224 + "funding": { 3225 + "type": "opencollective", 3226 + "url": "https://opencollective.com/unified" 3227 + } 3228 + }, 3229 + "node_modules/hast-util-whitespace": { 3230 + "version": "3.0.0", 3231 + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", 3232 + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", 3233 + "license": "MIT", 3234 + "dependencies": { 3235 + "@types/hast": "^3.0.0" 3236 + }, 3237 + "funding": { 3238 + "type": "opencollective", 3239 + "url": "https://opencollective.com/unified" 3240 + } 3241 + }, 3046 3242 "node_modules/help-me": { 3047 3243 "version": "5.0.0", 3048 3244 "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", ··· 3056 3252 "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", 3057 3253 "license": "MIT" 3058 3254 }, 3255 + "node_modules/html-void-elements": { 3256 + "version": "3.0.0", 3257 + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", 3258 + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", 3259 + "license": "MIT", 3260 + "funding": { 3261 + "type": "github", 3262 + "url": "https://github.com/sponsors/wooorm" 3263 + } 3264 + }, 3059 3265 "node_modules/htmlparser2": { 3060 3266 "version": "9.1.0", 3061 3267 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", ··· 3404 3610 "dev": true, 3405 3611 "license": "ISC" 3406 3612 }, 3613 + "node_modules/mdast-util-to-hast": { 3614 + "version": "13.2.0", 3615 + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", 3616 + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", 3617 + "license": "MIT", 3618 + "dependencies": { 3619 + "@types/hast": "^3.0.0", 3620 + "@types/mdast": "^4.0.0", 3621 + "@ungap/structured-clone": "^1.0.0", 3622 + "devlop": "^1.0.0", 3623 + "micromark-util-sanitize-uri": "^2.0.0", 3624 + "trim-lines": "^3.0.0", 3625 + "unist-util-position": "^5.0.0", 3626 + "unist-util-visit": "^5.0.0", 3627 + "vfile": "^6.0.0" 3628 + }, 3629 + "funding": { 3630 + "type": "opencollective", 3631 + "url": "https://opencollective.com/unified" 3632 + } 3633 + }, 3407 3634 "node_modules/media-typer": { 3408 3635 "version": "0.3.0", 3409 3636 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", ··· 3441 3668 "node": ">= 0.6" 3442 3669 } 3443 3670 }, 3671 + "node_modules/micromark-util-character": { 3672 + "version": "2.1.1", 3673 + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", 3674 + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", 3675 + "funding": [ 3676 + { 3677 + "type": "GitHub Sponsors", 3678 + "url": "https://github.com/sponsors/unifiedjs" 3679 + }, 3680 + { 3681 + "type": "OpenCollective", 3682 + "url": "https://opencollective.com/unified" 3683 + } 3684 + ], 3685 + "license": "MIT", 3686 + "dependencies": { 3687 + "micromark-util-symbol": "^2.0.0", 3688 + "micromark-util-types": "^2.0.0" 3689 + } 3690 + }, 3691 + "node_modules/micromark-util-encode": { 3692 + "version": "2.0.1", 3693 + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", 3694 + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", 3695 + "funding": [ 3696 + { 3697 + "type": "GitHub Sponsors", 3698 + "url": "https://github.com/sponsors/unifiedjs" 3699 + }, 3700 + { 3701 + "type": "OpenCollective", 3702 + "url": "https://opencollective.com/unified" 3703 + } 3704 + ], 3705 + "license": "MIT" 3706 + }, 3707 + "node_modules/micromark-util-sanitize-uri": { 3708 + "version": "2.0.1", 3709 + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", 3710 + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", 3711 + "funding": [ 3712 + { 3713 + "type": "GitHub Sponsors", 3714 + "url": "https://github.com/sponsors/unifiedjs" 3715 + }, 3716 + { 3717 + "type": "OpenCollective", 3718 + "url": "https://opencollective.com/unified" 3719 + } 3720 + ], 3721 + "license": "MIT", 3722 + "dependencies": { 3723 + "micromark-util-character": "^2.0.0", 3724 + "micromark-util-encode": "^2.0.0", 3725 + "micromark-util-symbol": "^2.0.0" 3726 + } 3727 + }, 3728 + "node_modules/micromark-util-symbol": { 3729 + "version": "2.0.1", 3730 + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", 3731 + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", 3732 + "funding": [ 3733 + { 3734 + "type": "GitHub Sponsors", 3735 + "url": "https://github.com/sponsors/unifiedjs" 3736 + }, 3737 + { 3738 + "type": "OpenCollective", 3739 + "url": "https://opencollective.com/unified" 3740 + } 3741 + ], 3742 + "license": "MIT" 3743 + }, 3744 + "node_modules/micromark-util-types": { 3745 + "version": "2.0.2", 3746 + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", 3747 + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", 3748 + "funding": [ 3749 + { 3750 + "type": "GitHub Sponsors", 3751 + "url": "https://github.com/sponsors/unifiedjs" 3752 + }, 3753 + { 3754 + "type": "OpenCollective", 3755 + "url": "https://opencollective.com/unified" 3756 + } 3757 + ], 3758 + "license": "MIT" 3759 + }, 3444 3760 "node_modules/micromatch": { 3445 3761 "version": "4.0.8", 3446 3762 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", ··· 3671 3987 "wrappy": "1" 3672 3988 } 3673 3989 }, 3990 + "node_modules/oniguruma-parser": { 3991 + "version": "0.12.1", 3992 + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", 3993 + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", 3994 + "license": "MIT" 3995 + }, 3996 + "node_modules/oniguruma-to-es": { 3997 + "version": "4.3.3", 3998 + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", 3999 + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", 4000 + "license": "MIT", 4001 + "dependencies": { 4002 + "oniguruma-parser": "^0.12.1", 4003 + "regex": "^6.0.1", 4004 + "regex-recursion": "^6.0.2" 4005 + } 4006 + }, 3674 4007 "node_modules/p-finally": { 3675 4008 "version": "1.0.0", 3676 4009 "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", ··· 3972 4305 "asap": "~2.0.3" 3973 4306 } 3974 4307 }, 4308 + "node_modules/property-information": { 4309 + "version": "7.1.0", 4310 + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", 4311 + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", 4312 + "license": "MIT", 4313 + "funding": { 4314 + "type": "github", 4315 + "url": "https://github.com/sponsors/wooorm" 4316 + } 4317 + }, 3975 4318 "node_modules/proxy-addr": { 3976 4319 "version": "2.0.7", 3977 4320 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", ··· 4284 4627 "node": ">= 12.13.0" 4285 4628 } 4286 4629 }, 4630 + "node_modules/regex": { 4631 + "version": "6.0.1", 4632 + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", 4633 + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", 4634 + "license": "MIT", 4635 + "dependencies": { 4636 + "regex-utilities": "^2.3.0" 4637 + } 4638 + }, 4639 + "node_modules/regex-recursion": { 4640 + "version": "6.0.2", 4641 + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", 4642 + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", 4643 + "license": "MIT", 4644 + "dependencies": { 4645 + "regex-utilities": "^2.3.0" 4646 + } 4647 + }, 4648 + "node_modules/regex-utilities": { 4649 + "version": "2.3.0", 4650 + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", 4651 + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", 4652 + "license": "MIT" 4653 + }, 4287 4654 "node_modules/resolve": { 4288 4655 "version": "1.22.8", 4289 4656 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", ··· 4564 4931 "node": ">=8" 4565 4932 } 4566 4933 }, 4934 + "node_modules/shiki": { 4935 + "version": "3.4.2", 4936 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.4.2.tgz", 4937 + "integrity": "sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==", 4938 + "license": "MIT", 4939 + "dependencies": { 4940 + "@shikijs/core": "3.4.2", 4941 + "@shikijs/engine-javascript": "3.4.2", 4942 + "@shikijs/engine-oniguruma": "3.4.2", 4943 + "@shikijs/langs": "3.4.2", 4944 + "@shikijs/themes": "3.4.2", 4945 + "@shikijs/types": "3.4.2", 4946 + "@shikijs/vscode-textmate": "^10.0.2", 4947 + "@types/hast": "^3.0.4" 4948 + } 4949 + }, 4567 4950 "node_modules/side-channel": { 4568 4951 "version": "1.0.6", 4569 4952 "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", ··· 4660 5043 }, 4661 5044 "engines": { 4662 5045 "node": ">= 8" 5046 + } 5047 + }, 5048 + "node_modules/space-separated-tokens": { 5049 + "version": "2.0.2", 5050 + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", 5051 + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", 5052 + "license": "MIT", 5053 + "funding": { 5054 + "type": "github", 5055 + "url": "https://github.com/sponsors/wooorm" 4663 5056 } 4664 5057 }, 4665 5058 "node_modules/split2": { ··· 4753 5146 "node": ">=8" 4754 5147 } 4755 5148 }, 5149 + "node_modules/stringify-entities": { 5150 + "version": "4.0.4", 5151 + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", 5152 + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", 5153 + "license": "MIT", 5154 + "dependencies": { 5155 + "character-entities-html4": "^2.0.0", 5156 + "character-entities-legacy": "^3.0.0" 5157 + }, 5158 + "funding": { 5159 + "type": "github", 5160 + "url": "https://github.com/sponsors/wooorm" 5161 + } 5162 + }, 4756 5163 "node_modules/strip-ansi": { 4757 5164 "version": "7.1.0", 4758 5165 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", ··· 5042 5449 "license": "MIT", 5043 5450 "bin": { 5044 5451 "tree-kill": "cli.js" 5452 + } 5453 + }, 5454 + "node_modules/trim-lines": { 5455 + "version": "3.0.1", 5456 + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", 5457 + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", 5458 + "license": "MIT", 5459 + "funding": { 5460 + "type": "github", 5461 + "url": "https://github.com/sponsors/wooorm" 5045 5462 } 5046 5463 }, 5047 5464 "node_modules/ts-interface-checker": { ··· 5752 6169 "dev": true, 5753 6170 "license": "MIT" 5754 6171 }, 6172 + "node_modules/unist-util-is": { 6173 + "version": "6.0.0", 6174 + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", 6175 + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", 6176 + "license": "MIT", 6177 + "dependencies": { 6178 + "@types/unist": "^3.0.0" 6179 + }, 6180 + "funding": { 6181 + "type": "opencollective", 6182 + "url": "https://opencollective.com/unified" 6183 + } 6184 + }, 6185 + "node_modules/unist-util-position": { 6186 + "version": "5.0.0", 6187 + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", 6188 + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", 6189 + "license": "MIT", 6190 + "dependencies": { 6191 + "@types/unist": "^3.0.0" 6192 + }, 6193 + "funding": { 6194 + "type": "opencollective", 6195 + "url": "https://opencollective.com/unified" 6196 + } 6197 + }, 6198 + "node_modules/unist-util-stringify-position": { 6199 + "version": "4.0.0", 6200 + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", 6201 + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 6202 + "license": "MIT", 6203 + "dependencies": { 6204 + "@types/unist": "^3.0.0" 6205 + }, 6206 + "funding": { 6207 + "type": "opencollective", 6208 + "url": "https://opencollective.com/unified" 6209 + } 6210 + }, 6211 + "node_modules/unist-util-visit": { 6212 + "version": "5.0.0", 6213 + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", 6214 + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", 6215 + "license": "MIT", 6216 + "dependencies": { 6217 + "@types/unist": "^3.0.0", 6218 + "unist-util-is": "^6.0.0", 6219 + "unist-util-visit-parents": "^6.0.0" 6220 + }, 6221 + "funding": { 6222 + "type": "opencollective", 6223 + "url": "https://opencollective.com/unified" 6224 + } 6225 + }, 6226 + "node_modules/unist-util-visit-parents": { 6227 + "version": "6.0.1", 6228 + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", 6229 + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", 6230 + "license": "MIT", 6231 + "dependencies": { 6232 + "@types/unist": "^3.0.0", 6233 + "unist-util-is": "^6.0.0" 6234 + }, 6235 + "funding": { 6236 + "type": "opencollective", 6237 + "url": "https://opencollective.com/unified" 6238 + } 6239 + }, 5755 6240 "node_modules/unpipe": { 5756 6241 "version": "1.0.0", 5757 6242 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", ··· 5796 6281 "license": "MIT", 5797 6282 "engines": { 5798 6283 "node": ">= 0.8" 6284 + } 6285 + }, 6286 + "node_modules/vfile": { 6287 + "version": "6.0.3", 6288 + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", 6289 + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", 6290 + "license": "MIT", 6291 + "dependencies": { 6292 + "@types/unist": "^3.0.0", 6293 + "vfile-message": "^4.0.0" 6294 + }, 6295 + "funding": { 6296 + "type": "opencollective", 6297 + "url": "https://opencollective.com/unified" 6298 + } 6299 + }, 6300 + "node_modules/vfile-message": { 6301 + "version": "4.0.2", 6302 + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", 6303 + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", 6304 + "license": "MIT", 6305 + "dependencies": { 6306 + "@types/unist": "^3.0.0", 6307 + "unist-util-stringify-position": "^4.0.0" 6308 + }, 6309 + "funding": { 6310 + "type": "opencollective", 6311 + "url": "https://opencollective.com/unified" 5799 6312 } 5800 6313 }, 5801 6314 "node_modules/void-elements": { ··· 6003 6516 "license": "MIT", 6004 6517 "funding": { 6005 6518 "url": "https://github.com/sponsors/colinhacks" 6519 + } 6520 + }, 6521 + "node_modules/zwitch": { 6522 + "version": "2.0.4", 6523 + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", 6524 + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", 6525 + "license": "MIT", 6526 + "funding": { 6527 + "type": "github", 6528 + "url": "https://github.com/sponsors/wooorm" 6006 6529 } 6007 6530 } 6008 6531 }
+1
package.json
··· 30 30 "multiformats": "^9.9.0", 31 31 "pino": "^9.3.2", 32 32 "pug": "^3.0.3", 33 + "shiki": "^3.4.2", 33 34 "uhtml": "^4.5.9" 34 35 }, 35 36 "devDependencies": {
+48
src/lib/highlight.ts
··· 1 + import { createHighlighter, HighlighterGeneric, BundledLanguage, BundledTheme } from 'shiki' 2 + import type { Element } from 'hast' 3 + 4 + let highlighter: HighlighterGeneric<BundledLanguage, BundledTheme> | null = null 5 + 6 + export async function getHighlighterInstance() { 7 + if (!highlighter) { 8 + highlighter = await createHighlighter({ 9 + themes: ['catppuccin-latte', 'catppuccin-mocha'], 10 + langs: [ 11 + 'javascript', 'typescript', 'python', 'java', 'rust', 12 + 'go', 'c', 'cpp', 'csharp', 'php', 'ruby', 'cobol', 13 + 'plaintext', 'txt', 'bash', 'nix' 14 + ] 15 + }) 16 + } 17 + return highlighter 18 + } 19 + 20 + export async function highlightCode(code: string, lang: string) { 21 + const highlighter = await getHighlighterInstance() 22 + 23 + try { 24 + return highlighter.codeToHtml(code, { 25 + lang: lang, 26 + themes: { 27 + light: 'catppuccin-latte', 28 + dark: 'catppuccin-mocha' 29 + }, 30 + transformers: [ 31 + { 32 + line(node: Element, line: number) { 33 + node.properties['code-line'] = line 34 + } 35 + } 36 + ] 37 + }) 38 + } catch (error) { 39 + console.warn(`Language "${lang}" not supported by Shiki, falling back to plaintext`) 40 + return highlighter.codeToHtml(code, { 41 + lang: 'txt', 42 + themes: { 43 + light: 'catppuccin-latte', 44 + dark: 'catppuccin-mocha' 45 + } 46 + }) 47 + } 48 + }
+33
src/public/styles.css
··· 231 231 .footer a:hover { 232 232 text-decoration: underline; 233 233 } 234 + 235 + .highlighted-code { 236 + margin: 1rem 0; 237 + counter-reset: step; 238 + counter-increment: step calc(var(--start, 1) - 1); 239 + } 240 + 241 + .highlighted-code pre { 242 + padding: 1rem; 243 + overflow-x: auto; 244 + border-radius: 4px; 245 + } 246 + 247 + code .line::before { 248 + content: counter(step); 249 + counter-increment: step; 250 + width: 1rem; 251 + margin-right: 1.5rem; 252 + display: inline-block; 253 + text-align: right; 254 + color: rgba(115,138,148,.4) 255 + } 256 + 257 + @media (prefers-color-scheme: dark) { 258 + .shiki, 259 + .shiki span { 260 + color: var(--shiki-dark) !important; 261 + background-color: var(--shiki-dark-bg) !important; 262 + font-style: var(--shiki-dark-font-style) !important; 263 + font-weight: var(--shiki-dark-font-weight) !important; 264 + text-decoration: var(--shiki-dark-text-decoration) !important; 265 + } 266 + }
+4
src/routes.ts
··· 11 11 12 12 import * as Paste from "#/lexicons/types/li/plonk/paste"; 13 13 import * as Comment from "#/lexicons/types/li/plonk/comment"; 14 + import { highlightCode } from "#/lib/highlight"; 14 15 15 16 type Session = { 16 17 did: string; ··· 209 210 ), 210 211 ); 211 212 213 + const highlightedCode = await highlightCode(pasteCode, pasteLang); 214 + 212 215 const paste = { 213 216 uri: pasteUri, 214 217 code: pasteCode, 218 + highlightedCode, 215 219 title: pasteTitle, 216 220 lang: pasteLang, 217 221 shortUrl,
+2
src/views/index.pug
··· 9 9 - 10 10 var langs = ["plaintext"] 11 11 .concat([ 12 + "bash", 12 13 "javascript", 13 14 "typescript", 14 15 "java", ··· 21 22 "c#", 22 23 "c++", 23 24 "cobol", 25 + "nix", 24 26 ].toSorted()) 25 27 doctype html 26 28 html
+3 -13
src/views/paste.pug
··· 15 15 | #{timeDifference(now, Date.parse(paste.createdAt))} ago · 16 16 | #{paste.lang} · 17 17 | #{paste.code.split('\n').length} loc · 18 - a(href=`/r/${paste.shortUrl}`) raw 19 - | &nbsp;· 20 - | #{comments.length} #{pluralize(comments.length, 'comment')} 21 - pre 22 - code 23 - - var lines = paste.code.split(/\r?\n|\r|\n/g) 24 - - var tot_chars = lines.length.toString().length 25 - each line, idx in lines 26 - span.code-line 27 - span.code-line-num(id=`L${idx + 1}` style=`min-width: ${tot_chars}ch;`) 28 - | #{idx + 1} 29 - span.code-line-content #{line} 18 + a(href=`/r/${paste.shortUrl}`) raw 19 + div.highlighted-code !{paste.highlightedCode} 30 20 hr 31 21 32 22 if comments.length != 0 ··· 53 43 a(href="/login") login 54 44 |&nbsp;to post a comment 55 45 56 - +footer() 46 + +footer()