-523
package-lock.json
-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",
30
29
"uhtml": "^4.5.9"
31
30
},
32
31
"devDependencies": {
···
1485
1484
"win32"
1486
1485
]
1487
1486
},
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
-
},
1555
1487
"node_modules/@ts-morph/common": {
1556
1488
"version": "0.17.0",
1557
1489
"resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz",
···
1670
1602
"@types/send": "*"
1671
1603
}
1672
1604
},
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
-
},
1682
1605
"node_modules/@types/http-errors": {
1683
1606
"version": "2.0.4",
1684
1607
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
1685
1608
"integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
1686
1609
"dev": true,
1687
1610
"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
-
}
1697
1611
},
1698
1612
"node_modules/@types/mime": {
1699
1613
"version": "1.3.5",
···
1748
1662
"@types/node": "*",
1749
1663
"@types/send": "*"
1750
1664
}
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"
1763
1665
},
1764
1666
"node_modules/@webreflection/signal": {
1765
1667
"version": "2.1.2",
···
2193
2095
"cborg": "cli.js"
2194
2096
}
2195
2097
},
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
-
},
2206
2098
"node_modules/chalk": {
2207
2099
"version": "4.1.2",
2208
2100
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
···
2218
2110
},
2219
2111
"funding": {
2220
2112
"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"
2241
2113
}
2242
2114
},
2243
2115
"node_modules/character-parser": {
···
2317
2189
"node": ">= 0.8"
2318
2190
}
2319
2191
},
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
-
},
2330
2192
"node_modules/commander": {
2331
2193
"version": "9.5.0",
2332
2194
"resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
···
2499
2361
"node": ">= 0.8"
2500
2362
}
2501
2363
},
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
-
},
2511
2364
"node_modules/destroy": {
2512
2365
"version": "1.2.0",
2513
2366
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
···
2525
2378
"license": "Apache-2.0",
2526
2379
"engines": {
2527
2380
"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"
2541
2381
}
2542
2382
},
2543
2383
"node_modules/diff": {
···
3203
3043
"node": ">= 0.4"
3204
3044
}
3205
3045
},
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
-
},
3242
3046
"node_modules/help-me": {
3243
3047
"version": "5.0.0",
3244
3048
"resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
···
3252
3056
"integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==",
3253
3057
"license": "MIT"
3254
3058
},
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
-
},
3265
3059
"node_modules/htmlparser2": {
3266
3060
"version": "9.1.0",
3267
3061
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
···
3610
3404
"dev": true,
3611
3405
"license": "ISC"
3612
3406
},
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
-
},
3634
3407
"node_modules/media-typer": {
3635
3408
"version": "0.3.0",
3636
3409
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
···
3668
3441
"node": ">= 0.6"
3669
3442
}
3670
3443
},
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
-
},
3760
3444
"node_modules/micromatch": {
3761
3445
"version": "4.0.8",
3762
3446
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
···
3987
3671
"wrappy": "1"
3988
3672
}
3989
3673
},
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
-
},
4007
3674
"node_modules/p-finally": {
4008
3675
"version": "1.0.0",
4009
3676
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
···
4305
3972
"asap": "~2.0.3"
4306
3973
}
4307
3974
},
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
-
},
4318
3975
"node_modules/proxy-addr": {
4319
3976
"version": "2.0.7",
4320
3977
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
···
4627
4284
"node": ">= 12.13.0"
4628
4285
}
4629
4286
},
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
-
},
4654
4287
"node_modules/resolve": {
4655
4288
"version": "1.22.8",
4656
4289
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
···
4931
4564
"node": ">=8"
4932
4565
}
4933
4566
},
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
-
},
4950
4567
"node_modules/side-channel": {
4951
4568
"version": "1.0.6",
4952
4569
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
···
5043
4660
},
5044
4661
"engines": {
5045
4662
"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"
5056
4663
}
5057
4664
},
5058
4665
"node_modules/split2": {
···
5146
4753
"node": ">=8"
5147
4754
}
5148
4755
},
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
-
},
5163
4756
"node_modules/strip-ansi": {
5164
4757
"version": "7.1.0",
5165
4758
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
···
5449
5042
"license": "MIT",
5450
5043
"bin": {
5451
5044
"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"
5462
5045
}
5463
5046
},
5464
5047
"node_modules/ts-interface-checker": {
···
6169
5752
"dev": true,
6170
5753
"license": "MIT"
6171
5754
},
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
-
},
6240
5755
"node_modules/unpipe": {
6241
5756
"version": "1.0.0",
6242
5757
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
···
6281
5796
"license": "MIT",
6282
5797
"engines": {
6283
5798
"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"
6312
5799
}
6313
5800
},
6314
5801
"node_modules/void-elements": {
···
6516
6003
"license": "MIT",
6517
6004
"funding": {
6518
6005
"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"
6529
6006
}
6530
6007
}
6531
6008
}
-1
package.json
-1
package.json
-48
src/lib/highlight.ts
-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
-
}
-52
src/public/styles.css
-52
src/public/styles.css
···
5
5
font-style: monospace;
6
6
}
7
7
8
-
@media (prefers-color-scheme: dark) {
9
-
.shiki,
10
-
.shiki span {
11
-
color: var(--shiki-dark) !important;
12
-
background-color: var(--shiki-dark-bg) !important;
13
-
font-style: var(--shiki-dark-font-style) !important;
14
-
font-weight: var(--shiki-dark-font-weight) !important;
15
-
text-decoration: var(--shiki-dark-text-decoration) !important;
16
-
}
17
-
}
18
-
19
8
:root {
20
9
/* Light mode colors */
21
10
--bg-color: white;
···
242
231
.footer a:hover {
243
232
text-decoration: underline;
244
233
}
245
-
246
-
.highlighted-code {
247
-
margin: 1rem 0;
248
-
counter-reset: step;
249
-
counter-increment: step calc(var(--start, 1) - 1);
250
-
}
251
-
252
-
.highlighted-code pre {
253
-
padding: 1rem;
254
-
overflow-x: auto;
255
-
border-radius: 4px;
256
-
}
257
-
258
-
code .line::before {
259
-
content: counter(step);
260
-
counter-increment: step;
261
-
width: 1rem;
262
-
margin-right: 1.5rem;
263
-
display: inline-block;
264
-
text-align: right;
265
-
color: rgba(115,138,148,.4)
266
-
}
267
-
268
-
#copy-btn {
269
-
background: none;
270
-
border: none;
271
-
padding: 0;
272
-
color: var(--text-color-muted);
273
-
cursor: pointer;
274
-
text-decoration: none;
275
-
font-family: inherit;
276
-
font-size: inherit;
277
-
}
278
-
279
-
#copy-btn:hover {
280
-
text-decoration: underline;
281
-
}
282
-
283
-
#copy-btn:focus {
284
-
outline: 1px solid var(--accent);
285
-
}
-4
src/routes.ts
-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";
15
14
16
15
type Session = {
17
16
did: string;
···
210
209
),
211
210
);
212
211
213
-
const highlightedCode = await highlightCode(pasteCode, pasteLang);
214
-
215
212
const paste = {
216
213
uri: pasteUri,
217
214
code: pasteCode,
218
-
highlightedCode,
219
215
title: pasteTitle,
220
216
lang: pasteLang,
221
217
shortUrl,
-2
src/views/index.pug
-2
src/views/index.pug
+9
-26
src/views/paste.pug
+9
-26
src/views/paste.pug
···
16
16
| #{paste.lang} ·
17
17
| #{paste.code.split('\n').length} loc ·
18
18
a(href=`/r/${paste.shortUrl}`) raw
19
-
| ·
20
-
button#copy-btn(type="button" onclick="copyToClipboard()" data-code=paste.code) copy
21
19
| ·
22
20
| #{comments.length} #{pluralize(comments.length, 'comment')}
23
-
div.highlighted-code !{paste.highlightedCode}
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}
24
30
hr
25
31
26
32
if comments.length != 0
···
48
54
| to post a comment
49
55
50
56
+footer()
51
-
script.
52
-
async function copyToClipboard() {
53
-
const copyBtn = document.getElementById('copy-btn');
54
-
const originalText = copyBtn.textContent;
55
-
56
-
try {
57
-
const code = copyBtn.dataset.code;
58
-
await navigator.clipboard.writeText(code);
59
-
copyBtn.textContent = 'copied!';
60
-
copyBtn.style.color = 'var(--accent)';
61
-
62
-
setTimeout(() => {
63
-
copyBtn.textContent = originalText;
64
-
copyBtn.style.color = '';
65
-
}, 1500);
66
-
} catch (err) {
67
-
console.error('Failed to copy: ', err);
68
-
copyBtn.textContent = 'copy failed';
69
-
setTimeout(() => {
70
-
copyBtn.textContent = originalText;
71
-
}, 1500);
72
-
}
73
-
}
+463
x
+463
x
···
1
+
From 489bb110616aa4da596aed7ae0a048c919ed333e Mon Sep 17 00:00:00 2001
2
+
From: Akshay <nerdy@peppe.rs>
3
+
Date: Thu, 26 Dec 2024 19:19:37 +0000
4
+
Subject: [PATCH 1/3] add footer, comments, linenrs etc
5
+
6
+
---
7
+
src/mixins/footer.pug | 9 +++++++++
8
+
src/mixins/post.pug | 3 ++-
9
+
src/mixins/utils.pug | 4 ++++
10
+
src/public/styles.css | 21 +++++++++++++++++++--
11
+
src/routes.ts | 33 +++++++++++++++++++++++++++++----
12
+
src/views/index.pug | 3 +++
13
+
src/views/paste.pug | 28 +++++++++++++++++++++-------
14
+
7 files changed, 87 insertions(+), 14 deletions(-)
15
+
create mode 100644 src/mixins/footer.pug
16
+
17
+
diff --git a/src/mixins/footer.pug b/src/mixins/footer.pug
18
+
new file mode 100644
19
+
index 0000000..be71086
20
+
--- /dev/null
21
+
+++ b/src/mixins/footer.pug
22
+
@@ -0,0 +1,9 @@
23
+
+mixin footer()
24
+
+ hr
25
+
+ div.footer
26
+
+ div.left-side
27
+
+ div.right-side
28
+
+ p
29
+
+ | made by
30
+
+ a(href="https://bsky.app/profile/oppi.li") @oppi.li
31
+
+
32
+
diff --git a/src/mixins/post.pug b/src/mixins/post.pug
33
+
index 77d78aa..e98bcf8 100644
34
+
--- a/src/mixins/post.pug
35
+
+++ b/src/mixins/post.pug
36
+
@@ -13,4 +13,5 @@ mixin post(paste, handle, did)
37
+
| #{paste.lang}
38
+
| ·
39
+
| #{paste.code.split('\n').length} loc
40
+
-
41
+
+ | ·
42
+
+ a(href=`/p/${paste.shortUrl}/#comments`) #{paste.commentCount} #{pluralize(paste.commentCount, 'comment')}
43
+
diff --git a/src/mixins/utils.pug b/src/mixins/utils.pug
44
+
index 857bddd..08507d3 100644
45
+
--- a/src/mixins/utils.pug
46
+
+++ b/src/mixins/utils.pug
47
+
@@ -2,6 +2,10 @@
48
+
function randInt(min, max) {
49
+
return Math.floor(Math.random() * (max - min + 1)) + min;
50
+
}
51
+
+-
52
+
+ function pluralize(count, noun) {
53
+
+ return count==1?noun:`${noun}s`;
54
+
+ }
55
+
-
56
+
function timeDifference(current, previous) {
57
+
if (!current || !previous) {
58
+
diff --git a/src/public/styles.css b/src/public/styles.css
59
+
index f88b533..6f80f5f 100644
60
+
--- a/src/public/styles.css
61
+
+++ b/src/public/styles.css
62
+
@@ -104,7 +104,6 @@ textarea {
63
+
hr {
64
+
border: none;
65
+
border-top: 1px solid var(--bg-color-muted);
66
+
- padding: 1rem;
67
+
}
68
+
69
+
.post-form {
70
+
@@ -152,7 +151,7 @@ hr {
71
+
flex: 1
72
+
}
73
+
74
+
-.header {
75
+
+.header, .footer {
76
+
display: flex;
77
+
flex-direction: row;
78
+
justify-content: space-between;
79
+
@@ -165,3 +164,21 @@ select {
80
+
text-indent: 1px;
81
+
text-overflow: '';
82
+
}
83
+
+
84
+
+.code-line {
85
+
+ display: flex;
86
+
+}
87
+
+
88
+
+.code-line-num {
89
+
+ white-space: pre;
90
+
+ -webkit-user-select: none;
91
+
+ user-select: none;
92
+
+ margin-right: 0.4em;
93
+
+ padding: 0 0.4em 0 0.4em;
94
+
+ color: var(--text-color-muted);
95
+
+ text-align: right;
96
+
+}
97
+
+
98
+
+.code-line-content {
99
+
+ color: var(--text-color);
100
+
+}
101
+
diff --git a/src/routes.ts b/src/routes.ts
102
+
index 70f931d..17fa00e 100644
103
+
--- a/src/routes.ts
104
+
+++ b/src/routes.ts
105
+
@@ -105,8 +105,20 @@ export const createRouter = (ctx: Ctx) => {
106
+
const agent = await getSessionAgent(req, res, ctx);
107
+
const pastes = await ctx.db
108
+
.selectFrom("paste")
109
+
- .selectAll()
110
+
- .orderBy("indexedAt", "desc")
111
+
+ .leftJoin("comment", "comment.pasteUri", "paste.uri")
112
+
+ .select([
113
+
+ "paste.uri",
114
+
+ "paste.shortUrl",
115
+
+ "paste.authorDid",
116
+
+ "paste.code",
117
+
+ "paste.lang",
118
+
+ "paste.title",
119
+
+ "paste.createdAt",
120
+
+ "paste.indexedAt as pasteIndexedAt",
121
+
+ ctx.db.fn.count("comment.uri").as("commentCount")
122
+
+ ])
123
+
+ .groupBy("paste.uri")
124
+
+ .orderBy("pasteIndexedAt", "desc")
125
+
.limit(25)
126
+
.execute();
127
+
128
+
@@ -130,8 +142,21 @@ export const createRouter = (ctx: Ctx) => {
129
+
const { authorDid } = req.params;
130
+
const pastes = await ctx.db
131
+
.selectFrom("paste")
132
+
- .selectAll()
133
+
- .where("authorDid", "=", authorDid)
134
+
+ .leftJoin("comment", "comment.pasteUri", "paste.uri")
135
+
+ .select([
136
+
+ "paste.uri",
137
+
+ "paste.shortUrl",
138
+
+ "paste.authorDid as pasteAuthorDid",
139
+
+ "paste.code",
140
+
+ "paste.lang",
141
+
+ "paste.title",
142
+
+ "paste.createdAt as pasteCreatedAt",
143
+
+ "paste.indexedAt as pasteIndexedAt",
144
+
+ ctx.db.fn.count("comment.uri").as("commentCount")
145
+
+ ])
146
+
+ .groupBy("paste.uri")
147
+
+ .where("pasteAuthorDid", "=", authorDid)
148
+
+ .orderBy("pasteCreatedAt", "desc")
149
+
.execute();
150
+
let didHandleMap: Record<string, string> = {};
151
+
didHandleMap[authorDid] = await ctx.resolver.resolveDidToHandle(authorDid);
152
+
diff --git a/src/views/index.pug b/src/views/index.pug
153
+
index 3443deb..e04403d 100644
154
+
--- a/src/views/index.pug
155
+
+++ b/src/views/index.pug
156
+
@@ -1,6 +1,7 @@
157
+
include ../mixins/mkPost
158
+
include ../mixins/head
159
+
include ../mixins/header
160
+
+include ../mixins/footer
161
+
include ../mixins/utils
162
+
include ../mixins/post
163
+
164
+
@@ -19,6 +20,7 @@ include ../mixins/post
165
+
"c",
166
+
"c#",
167
+
"c++",
168
+
+ "cobol",
169
+
].toSorted())
170
+
doctype html
171
+
html
172
+
@@ -34,3 +36,4 @@ html
173
+
each paste in pastes
174
+
- var handle = didHandleMap[paste.authorDid]
175
+
+post(paste, handle, paste.authorDid)
176
+
+ +footer()
177
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
178
+
index 29516d3..f8a0906 100644
179
+
--- a/src/views/paste.pug
180
+
+++ b/src/views/paste.pug
181
+
@@ -15,12 +15,21 @@ html
182
+
| #{paste.lang} ·
183
+
| #{paste.code.split('\n').length} loc ·
184
+
a(href=`/r/${paste.shortUrl}`) raw
185
+
+ | ·
186
+
+ | #{comments.length} #{pluralize(comments.length, 'comment')}
187
+
pre
188
+
- | #{paste.code}
189
+
+ code
190
+
+ - var lines = paste.code.split(/\r?\n|\r|\n/g)
191
+
+ - var tot_chars = lines.length.toString().length
192
+
+ each line, idx in lines
193
+
+ span.code-line
194
+
+ span.code-line-num(id=`L${idx + 1}` style=`min-width: ${tot_chars}ch;`)
195
+
+ | #{idx + 1}
196
+
+ span.code-line-content #{line}
197
+
hr
198
+
199
+
if comments.length != 0
200
+
- h1 comments
201
+
+ h1(id="comments") comments
202
+
div.comments
203
+
each comment in comments
204
+
div.comment(id=`${encodeURIComponent(comment.uri)}`)
205
+
@@ -33,9 +42,14 @@ html
206
+
pre.comment-body #{comment.body}
207
+
hr
208
+
209
+
- form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
210
+
- div.post-row
211
+
- textarea#code(name="comment" rows="5" placeholder="add a comment" required).post-input-code
212
+
+ if ownDid
213
+
+ form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
214
+
+ div.post-row
215
+
+ textarea#code(name="comment" rows="5" placeholder="add a comment" required).post-input-code
216
+
217
+
- div.post-submit-row
218
+
- button(type="submit").post-input-submit zonk!
219
+
+ div.post-submit-row
220
+
+ button(type="submit").post-input-submit zonk!
221
+
+ else
222
+
+ p
223
+
+ a(href="/login") login
224
+
+ | to post a comment
225
+
--
226
+
2.47.0
227
+
228
+
From 436f4d5e8912c50068d8c70e623a23ce2ca9e6e7 Mon Sep 17 00:00:00 2001
229
+
From: Akshay <nerdy@peppe.rs>
230
+
Date: Thu, 26 Dec 2024 21:12:07 +0000
231
+
Subject: [PATCH 2/3] footer everywhere
232
+
233
+
---
234
+
src/views/index.pug | 1 +
235
+
src/views/login.pug | 2 ++
236
+
src/views/paste.pug | 6 ++++--
237
+
src/views/user.pug | 3 +++
238
+
4 files changed, 10 insertions(+), 2 deletions(-)
239
+
240
+
diff --git a/src/views/index.pug b/src/views/index.pug
241
+
index e04403d..bc9085a 100644
242
+
--- a/src/views/index.pug
243
+
+++ b/src/views/index.pug
244
+
@@ -36,4 +36,5 @@ html
245
+
each paste in pastes
246
+
- var handle = didHandleMap[paste.authorDid]
247
+
+post(paste, handle, paste.authorDid)
248
+
+
249
+
+footer()
250
+
diff --git a/src/views/login.pug b/src/views/login.pug
251
+
index 55aa048..b5a35e0 100644
252
+
--- a/src/views/login.pug
253
+
+++ b/src/views/login.pug
254
+
@@ -1,4 +1,5 @@
255
+
include ../mixins/head
256
+
+include ../mixins/footer
257
+
258
+
doctype html
259
+
html
260
+
@@ -10,3 +11,4 @@ html
261
+
div.login-row
262
+
input(type="text" name="handle" placeholder="enter handle" required).login-input-title
263
+
button(type="submit").login-submit-button login
264
+
+ +footer()
265
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
266
+
index f8a0906..653c02e 100644
267
+
--- a/src/views/paste.pug
268
+
+++ b/src/views/paste.pug
269
+
@@ -1,6 +1,7 @@
270
+
- var now = new Date()
271
+
include ../mixins/head
272
+
include ../mixins/header
273
+
+include ../mixins/footer
274
+
include ../mixins/utils
275
+
doctype html
276
+
html
277
+
@@ -40,7 +41,6 @@ html
278
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago
279
+
p
280
+
pre.comment-body #{comment.body}
281
+
- hr
282
+
283
+
if ownDid
284
+
form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
285
+
@@ -49,7 +49,9 @@ html
286
+
287
+
div.post-submit-row
288
+
button(type="submit").post-input-submit zonk!
289
+
- else
290
+
+ else
291
+
p
292
+
a(href="/login") login
293
+
| to post a comment
294
+
+
295
+
+ +footer()
296
+
diff --git a/src/views/user.pug b/src/views/user.pug
297
+
index 3523e16..b2b2743 100644
298
+
--- a/src/views/user.pug
299
+
+++ b/src/views/user.pug
300
+
@@ -2,6 +2,7 @@
301
+
- var handle = didHandleMap[authorDid]
302
+
include ../mixins/head
303
+
include ../mixins/header
304
+
+include ../mixins/footer
305
+
include ../mixins/utils
306
+
include ../mixins/post
307
+
doctype html
308
+
@@ -14,3 +15,5 @@ html
309
+
div.timeline
310
+
each paste in pastes
311
+
+post(paste, handle, authorDid)
312
+
+
313
+
+ +footer()
314
+
--
315
+
2.47.0
316
+
317
+
From a717f0702e818515e34187cde86c15c00d2e66ba Mon Sep 17 00:00:00 2001
318
+
From: Akshay <nerdy@peppe.rs>
319
+
Date: Thu, 26 Dec 2024 23:14:37 +0000
320
+
Subject: [PATCH 3/3] stylin for links
321
+
322
+
---
323
+
src/mixins/post.pug | 2 +-
324
+
src/public/styles.css | 51 ++++++++++++++++++++++++++++++++++++++++++-
325
+
src/views/paste.pug | 9 ++++----
326
+
3 files changed, 55 insertions(+), 7 deletions(-)
327
+
328
+
diff --git a/src/mixins/post.pug b/src/mixins/post.pug
329
+
index e98bcf8..51af1ff 100644
330
+
--- a/src/mixins/post.pug
331
+
+++ b/src/mixins/post.pug
332
+
@@ -1,7 +1,7 @@
333
+
mixin post(paste, handle, did)
334
+
div.post
335
+
p
336
+
- a(href=`/p/${paste.shortUrl}`)
337
+
+ a(href=`/p/${paste.shortUrl}`).post-link
338
+
| #{paste.title}
339
+
p.post-info
340
+
| by
341
+
diff --git a/src/public/styles.css b/src/public/styles.css
342
+
index 6f80f5f..b153f92 100644
343
+
--- a/src/public/styles.css
344
+
+++ b/src/public/styles.css
345
+
@@ -58,7 +58,6 @@ a:visited {
346
+
}
347
+
348
+
pre {
349
+
- background-color: var(--bg-color-muted);
350
+
padding: 1rem;
351
+
overflow-x: auto;
352
+
}
353
+
@@ -66,6 +65,11 @@ pre {
354
+
.comment-body {
355
+
background-color: var(--bg-color);
356
+
padding: 0;
357
+
+ margin-top: 0.1rem;
358
+
+}
359
+
+
360
+
+.comment-info {
361
+
+ margin-bottom: 0;
362
+
}
363
+
364
+
input, textarea, select, button {
365
+
@@ -137,10 +141,40 @@ hr {
366
+
align-self: flex-end;
367
+
}
368
+
369
+
+.post-link {
370
+
+ color: var(--text-color);
371
+
+ text-decoration: none;
372
+
+}
373
+
+.post-link:hover {
374
+
+ text-decoration: underline;
375
+
+}
376
+
+.post-link:visited {
377
+
+ color: var(--text-color-muted);
378
+
+}
379
+
+
380
+
+.post-info {
381
+
+ margin-top: 0;
382
+
+}
383
+
+
384
+
+.post-info, .comment-info {
385
+
+ color: var(--text-color-muted);
386
+
+}
387
+
+.post-info a, .comment-info a {
388
+
+ color: var(--text-color-muted);
389
+
+ text-decoration: none;
390
+
+}
391
+
+.post-info a:visited, .comment-info a:visited {
392
+
+ color: var(--text-color-muted);
393
+
+}
394
+
+.post-info a:hover, .comment-info a:hover {
395
+
+ text-decoration: underline;
396
+
+}
397
+
+
398
+
.timeline, .comments {
399
+
display: flex;
400
+
flex-direction: column;
401
+
gap: 1rem;
402
+
+ padding-bottom: 1rem;
403
+
}
404
+
405
+
.login-input-title {
406
+
@@ -182,3 +216,18 @@ select {
407
+
.code-line-content {
408
+
color: var(--text-color);
409
+
}
410
+
+
411
+
+.header, .footer {
412
+
+ color: var(--text-color);
413
+
+}
414
+
+
415
+
+.header a, .header a:visited,
416
+
+.footer a, .footer a:visited {
417
+
+ color: var(--link-color);
418
+
+ text-decoration: none;
419
+
+}
420
+
+
421
+
+.header a:hover,
422
+
+.footer a:hover {
423
+
+ text-decoration: underline;
424
+
+}
425
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
426
+
index 653c02e..3014107 100644
427
+
--- a/src/views/paste.pug
428
+
+++ b/src/views/paste.pug
429
+
@@ -10,13 +10,13 @@ html
430
+
main#content
431
+
+header(ownDid, didHandleMap)
432
+
h1 #{paste.title}
433
+
- p
434
+
+ p.post-info
435
+
| @#{didHandleMap[paste.authorDid]} ·
436
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago ·
437
+
| #{paste.lang} ·
438
+
| #{paste.code.split('\n').length} loc ·
439
+
a(href=`/r/${paste.shortUrl}`) raw
440
+
- | ·
441
+
+ | ·
442
+
| #{comments.length} #{pluralize(comments.length, 'comment')}
443
+
pre
444
+
code
445
+
@@ -34,13 +34,12 @@ html
446
+
div.comments
447
+
each comment in comments
448
+
div.comment(id=`${encodeURIComponent(comment.uri)}`)
449
+
- p
450
+
+ p.comment-info
451
+
a(href=`/u/${comment.authorDid}`)
452
+
| @#{didHandleMap[comment.authorDid]}
453
+
| ·
454
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago
455
+
- p
456
+
- pre.comment-body #{comment.body}
457
+
+ pre.comment-body #{comment.body}
458
+
459
+
if ownDid
460
+
form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
461
+
--
462
+
2.47.0
463
+
+465
y
+465
y
···
1
+
From 6df2fc36269c7114fb845fa0ac667e08f6e7d09b Mon Sep 17 00:00:00 2001
2
+
From: Akshay <nerdy@peppe.rs>
3
+
Date: Thu, 26 Dec 2024 19:19:37 +0000
4
+
Subject: [PATCH 1/3] add footer, comments, linenrs etc
5
+
6
+
---
7
+
src/mixins/footer.pug | 9 +++++++++
8
+
src/mixins/post.pug | 3 ++-
9
+
src/mixins/utils.pug | 4 ++++
10
+
src/public/styles.css | 21 +++++++++++++++++++--
11
+
src/routes.ts | 33 +++++++++++++++++++++++++++++----
12
+
src/views/index.pug | 3 +++
13
+
src/views/paste.pug | 28 +++++++++++++++++++++-------
14
+
7 files changed, 87 insertions(+), 14 deletions(-)
15
+
create mode 100644 src/mixins/footer.pug
16
+
17
+
diff --git a/src/mixins/footer.pug b/src/mixins/footer.pug
18
+
new file mode 100644
19
+
index 0000000..be71086
20
+
--- /dev/null
21
+
+++ b/src/mixins/footer.pug
22
+
@@ -0,0 +1,9 @@
23
+
+mixin footer()
24
+
+ hr
25
+
+ div.footer
26
+
+ div.left-side
27
+
+ div.right-side
28
+
+ p
29
+
+ | made by
30
+
+ a(href="https://bsky.app/profile/oppi.li") @oppi.li
31
+
+
32
+
diff --git a/src/mixins/post.pug b/src/mixins/post.pug
33
+
index 77d78aa..e98bcf8 100644
34
+
--- a/src/mixins/post.pug
35
+
+++ b/src/mixins/post.pug
36
+
@@ -13,4 +13,5 @@ mixin post(paste, handle, did)
37
+
| #{paste.lang}
38
+
| ·
39
+
| #{paste.code.split('\n').length} loc
40
+
-
41
+
+ | ·
42
+
+ a(href=`/p/${paste.shortUrl}/#comments`) #{paste.commentCount} #{pluralize(paste.commentCount, 'comment')}
43
+
diff --git a/src/mixins/utils.pug b/src/mixins/utils.pug
44
+
index 857bddd..08507d3 100644
45
+
--- a/src/mixins/utils.pug
46
+
+++ b/src/mixins/utils.pug
47
+
@@ -2,6 +2,10 @@
48
+
function randInt(min, max) {
49
+
return Math.floor(Math.random() * (max - min + 1)) + min;
50
+
}
51
+
+-
52
+
+ function pluralize(count, noun) {
53
+
+ return count==1?noun:`${noun}s`;
54
+
+ }
55
+
-
56
+
function timeDifference(current, previous) {
57
+
if (!current || !previous) {
58
+
diff --git a/src/public/styles.css b/src/public/styles.css
59
+
index f88b533..6f80f5f 100644
60
+
--- a/src/public/styles.css
61
+
+++ b/src/public/styles.css
62
+
@@ -104,7 +104,6 @@ textarea {
63
+
hr {
64
+
border: none;
65
+
border-top: 1px solid var(--bg-color-muted);
66
+
- padding: 1rem;
67
+
}
68
+
69
+
.post-form {
70
+
@@ -152,7 +151,7 @@ hr {
71
+
flex: 1
72
+
}
73
+
74
+
-.header {
75
+
+.header, .footer {
76
+
display: flex;
77
+
flex-direction: row;
78
+
justify-content: space-between;
79
+
@@ -165,3 +164,21 @@ select {
80
+
text-indent: 1px;
81
+
text-overflow: '';
82
+
}
83
+
+
84
+
+.code-line {
85
+
+ display: flex;
86
+
+}
87
+
+
88
+
+.code-line-num {
89
+
+ white-space: pre;
90
+
+ -webkit-user-select: none;
91
+
+ user-select: none;
92
+
+ margin-right: 0.4em;
93
+
+ padding: 0 0.4em 0 0.4em;
94
+
+ color: var(--text-color-muted);
95
+
+ text-align: right;
96
+
+}
97
+
+
98
+
+.code-line-content {
99
+
+ color: var(--text-color);
100
+
+}
101
+
diff --git a/src/routes.ts b/src/routes.ts
102
+
index 70f931d..17fa00e 100644
103
+
--- a/src/routes.ts
104
+
+++ b/src/routes.ts
105
+
@@ -105,8 +105,20 @@ export const createRouter = (ctx: Ctx) => {
106
+
const agent = await getSessionAgent(req, res, ctx);
107
+
const pastes = await ctx.db
108
+
.selectFrom("paste")
109
+
- .selectAll()
110
+
- .orderBy("indexedAt", "desc")
111
+
+ .leftJoin("comment", "comment.pasteUri", "paste.uri")
112
+
+ .select([
113
+
+ "paste.uri",
114
+
+ "paste.shortUrl",
115
+
+ "paste.authorDid",
116
+
+ "paste.code",
117
+
+ "paste.lang",
118
+
+ "paste.title",
119
+
+ "paste.createdAt",
120
+
+ "paste.indexedAt as pasteIndexedAt",
121
+
+ ctx.db.fn.count("comment.uri").as("commentCount")
122
+
+ ])
123
+
+ .groupBy("paste.uri")
124
+
+ .orderBy("pasteIndexedAt", "desc")
125
+
.limit(25)
126
+
.execute();
127
+
128
+
@@ -130,8 +142,21 @@ export const createRouter = (ctx: Ctx) => {
129
+
const { authorDid } = req.params;
130
+
const pastes = await ctx.db
131
+
.selectFrom("paste")
132
+
- .selectAll()
133
+
- .where("authorDid", "=", authorDid)
134
+
+ .leftJoin("comment", "comment.pasteUri", "paste.uri")
135
+
+ .select([
136
+
+ "paste.uri",
137
+
+ "paste.shortUrl",
138
+
+ "paste.authorDid as pasteAuthorDid",
139
+
+ "paste.code",
140
+
+ "paste.lang",
141
+
+ "paste.title",
142
+
+ "paste.createdAt as pasteCreatedAt",
143
+
+ "paste.indexedAt as pasteIndexedAt",
144
+
+ ctx.db.fn.count("comment.uri").as("commentCount")
145
+
+ ])
146
+
+ .groupBy("paste.uri")
147
+
+ .where("pasteAuthorDid", "=", authorDid)
148
+
+ .orderBy("pasteCreatedAt", "desc")
149
+
.execute();
150
+
let didHandleMap: Record<string, string> = {};
151
+
didHandleMap[authorDid] = await ctx.resolver.resolveDidToHandle(authorDid);
152
+
diff --git a/src/views/index.pug b/src/views/index.pug
153
+
index 3443deb..e04403d 100644
154
+
--- a/src/views/index.pug
155
+
+++ b/src/views/index.pug
156
+
@@ -1,6 +1,7 @@
157
+
include ../mixins/mkPost
158
+
include ../mixins/head
159
+
include ../mixins/header
160
+
+include ../mixins/footer
161
+
include ../mixins/utils
162
+
include ../mixins/post
163
+
164
+
@@ -19,6 +20,7 @@ include ../mixins/post
165
+
"c",
166
+
"c#",
167
+
"c++",
168
+
+ "cobol",
169
+
].toSorted())
170
+
doctype html
171
+
html
172
+
@@ -34,3 +36,4 @@ html
173
+
each paste in pastes
174
+
- var handle = didHandleMap[paste.authorDid]
175
+
+post(paste, handle, paste.authorDid)
176
+
+ +footer()
177
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
178
+
index 29516d3..f8a0906 100644
179
+
--- a/src/views/paste.pug
180
+
+++ b/src/views/paste.pug
181
+
@@ -15,12 +15,21 @@ html
182
+
| #{paste.lang} ·
183
+
| #{paste.code.split('\n').length} loc ·
184
+
a(href=`/r/${paste.shortUrl}`) raw
185
+
+ | ·
186
+
+ | #{comments.length} #{pluralize(comments.length, 'comment')}
187
+
pre
188
+
- | #{paste.code}
189
+
+ code
190
+
+ - var lines = paste.code.split(/\r?\n|\r|\n/g)
191
+
+ - var tot_chars = lines.length.toString().length
192
+
+ each line, idx in lines
193
+
+ span.code-line
194
+
+ span.code-line-num(id=`L${idx + 1}` style=`min-width: ${tot_chars}ch;`)
195
+
+ | #{idx + 1}
196
+
+ span.code-line-content #{line}
197
+
hr
198
+
199
+
if comments.length != 0
200
+
- h1 comments
201
+
+ h1(id="comments") comments
202
+
div.comments
203
+
each comment in comments
204
+
div.comment(id=`${encodeURIComponent(comment.uri)}`)
205
+
@@ -33,9 +42,14 @@ html
206
+
pre.comment-body #{comment.body}
207
+
hr
208
+
209
+
- form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
210
+
- div.post-row
211
+
- textarea#code(name="comment" rows="5" placeholder="add a comment" required).post-input-code
212
+
+ if ownDid
213
+
+ form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
214
+
+ div.post-row
215
+
+ textarea#code(name="comment" rows="5" placeholder="add a comment" required).post-input-code
216
+
217
+
- div.post-submit-row
218
+
- button(type="submit").post-input-submit zonk!
219
+
+ div.post-submit-row
220
+
+ button(type="submit").post-input-submit zonk!
221
+
+ else
222
+
+ p
223
+
+ a(href="/login") login
224
+
+ | to post a comment
225
+
--
226
+
2.47.0
227
+
228
+
229
+
From ccd3269be5d287b627c8badc96bd0ce5f0d3a0bf Mon Sep 17 00:00:00 2001
230
+
From: Akshay <nerdy@peppe.rs>
231
+
Date: Thu, 26 Dec 2024 21:12:07 +0000
232
+
Subject: [PATCH 2/3] footer everywhere
233
+
234
+
---
235
+
src/views/index.pug | 1 +
236
+
src/views/login.pug | 2 ++
237
+
src/views/paste.pug | 6 ++++--
238
+
src/views/user.pug | 3 +++
239
+
4 files changed, 10 insertions(+), 2 deletions(-)
240
+
241
+
diff --git a/src/views/index.pug b/src/views/index.pug
242
+
index e04403d..bc9085a 100644
243
+
--- a/src/views/index.pug
244
+
+++ b/src/views/index.pug
245
+
@@ -36,4 +36,5 @@ html
246
+
each paste in pastes
247
+
- var handle = didHandleMap[paste.authorDid]
248
+
+post(paste, handle, paste.authorDid)
249
+
+
250
+
+footer()
251
+
diff --git a/src/views/login.pug b/src/views/login.pug
252
+
index 55aa048..b5a35e0 100644
253
+
--- a/src/views/login.pug
254
+
+++ b/src/views/login.pug
255
+
@@ -1,4 +1,5 @@
256
+
include ../mixins/head
257
+
+include ../mixins/footer
258
+
259
+
doctype html
260
+
html
261
+
@@ -10,3 +11,4 @@ html
262
+
div.login-row
263
+
input(type="text" name="handle" placeholder="enter handle" required).login-input-title
264
+
button(type="submit").login-submit-button login
265
+
+ +footer()
266
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
267
+
index f8a0906..653c02e 100644
268
+
--- a/src/views/paste.pug
269
+
+++ b/src/views/paste.pug
270
+
@@ -1,6 +1,7 @@
271
+
- var now = new Date()
272
+
include ../mixins/head
273
+
include ../mixins/header
274
+
+include ../mixins/footer
275
+
include ../mixins/utils
276
+
doctype html
277
+
html
278
+
@@ -40,7 +41,6 @@ html
279
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago
280
+
p
281
+
pre.comment-body #{comment.body}
282
+
- hr
283
+
284
+
if ownDid
285
+
form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
286
+
@@ -49,7 +49,9 @@ html
287
+
288
+
div.post-submit-row
289
+
button(type="submit").post-input-submit zonk!
290
+
- else
291
+
+ else
292
+
p
293
+
a(href="/login") login
294
+
| to post a comment
295
+
+
296
+
+ +footer()
297
+
diff --git a/src/views/user.pug b/src/views/user.pug
298
+
index 3523e16..b2b2743 100644
299
+
--- a/src/views/user.pug
300
+
+++ b/src/views/user.pug
301
+
@@ -2,6 +2,7 @@
302
+
- var handle = didHandleMap[authorDid]
303
+
include ../mixins/head
304
+
include ../mixins/header
305
+
+include ../mixins/footer
306
+
include ../mixins/utils
307
+
include ../mixins/post
308
+
doctype html
309
+
@@ -14,3 +15,5 @@ html
310
+
div.timeline
311
+
each paste in pastes
312
+
+post(paste, handle, authorDid)
313
+
+
314
+
+ +footer()
315
+
--
316
+
2.47.0
317
+
318
+
319
+
From 0d1ee81ee0630ca852f51a9a49293fb7d0fc7a67 Mon Sep 17 00:00:00 2001
320
+
From: Akshay <nerdy@peppe.rs>
321
+
Date: Thu, 26 Dec 2024 23:14:37 +0000
322
+
Subject: [PATCH 3/3] stylin for links
323
+
324
+
---
325
+
src/mixins/post.pug | 2 +-
326
+
src/public/styles.css | 51 ++++++++++++++++++++++++++++++++++++++++++-
327
+
src/views/paste.pug | 9 ++++----
328
+
3 files changed, 55 insertions(+), 7 deletions(-)
329
+
330
+
diff --git a/src/mixins/post.pug b/src/mixins/post.pug
331
+
index e98bcf8..51af1ff 100644
332
+
--- a/src/mixins/post.pug
333
+
+++ b/src/mixins/post.pug
334
+
@@ -1,7 +1,7 @@
335
+
mixin post(paste, handle, did)
336
+
div.post
337
+
p
338
+
- a(href=`/p/${paste.shortUrl}`)
339
+
+ a(href=`/p/${paste.shortUrl}`).post-link
340
+
| #{paste.title}
341
+
p.post-info
342
+
| by
343
+
diff --git a/src/public/styles.css b/src/public/styles.css
344
+
index 6f80f5f..b153f92 100644
345
+
--- a/src/public/styles.css
346
+
+++ b/src/public/styles.css
347
+
@@ -58,7 +58,6 @@ a:visited {
348
+
}
349
+
350
+
pre {
351
+
- background-color: var(--bg-color-muted);
352
+
padding: 1rem;
353
+
overflow-x: auto;
354
+
}
355
+
@@ -66,6 +65,11 @@ pre {
356
+
.comment-body {
357
+
background-color: var(--bg-color);
358
+
padding: 0;
359
+
+ margin-top: 0.1rem;
360
+
+}
361
+
+
362
+
+.comment-info {
363
+
+ margin-bottom: 0;
364
+
}
365
+
366
+
input, textarea, select, button {
367
+
@@ -137,10 +141,40 @@ hr {
368
+
align-self: flex-end;
369
+
}
370
+
371
+
+.post-link {
372
+
+ color: var(--text-color);
373
+
+ text-decoration: none;
374
+
+}
375
+
+.post-link:hover {
376
+
+ text-decoration: underline;
377
+
+}
378
+
+.post-link:visited {
379
+
+ color: var(--text-color-muted);
380
+
+}
381
+
+
382
+
+.post-info {
383
+
+ margin-top: 0;
384
+
+}
385
+
+
386
+
+.post-info, .comment-info {
387
+
+ color: var(--text-color-muted);
388
+
+}
389
+
+.post-info a, .comment-info a {
390
+
+ color: var(--text-color-muted);
391
+
+ text-decoration: none;
392
+
+}
393
+
+.post-info a:visited, .comment-info a:visited {
394
+
+ color: var(--text-color-muted);
395
+
+}
396
+
+.post-info a:hover, .comment-info a:hover {
397
+
+ text-decoration: underline;
398
+
+}
399
+
+
400
+
.timeline, .comments {
401
+
display: flex;
402
+
flex-direction: column;
403
+
gap: 1rem;
404
+
+ padding-bottom: 1rem;
405
+
}
406
+
407
+
.login-input-title {
408
+
@@ -182,3 +216,18 @@ select {
409
+
.code-line-content {
410
+
color: var(--text-color);
411
+
}
412
+
+
413
+
+.header, .footer {
414
+
+ color: var(--text-color);
415
+
+}
416
+
+
417
+
+.header a, .header a:visited,
418
+
+.footer a, .footer a:visited {
419
+
+ color: var(--link-color);
420
+
+ text-decoration: none;
421
+
+}
422
+
+
423
+
+.header a:hover,
424
+
+.footer a:hover {
425
+
+ text-decoration: underline;
426
+
+}
427
+
diff --git a/src/views/paste.pug b/src/views/paste.pug
428
+
index 653c02e..3014107 100644
429
+
--- a/src/views/paste.pug
430
+
+++ b/src/views/paste.pug
431
+
@@ -10,13 +10,13 @@ html
432
+
main#content
433
+
+header(ownDid, didHandleMap)
434
+
h1 #{paste.title}
435
+
- p
436
+
+ p.post-info
437
+
| @#{didHandleMap[paste.authorDid]} ·
438
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago ·
439
+
| #{paste.lang} ·
440
+
| #{paste.code.split('\n').length} loc ·
441
+
a(href=`/r/${paste.shortUrl}`) raw
442
+
- | ·
443
+
+ | ·
444
+
| #{comments.length} #{pluralize(comments.length, 'comment')}
445
+
pre
446
+
code
447
+
@@ -34,13 +34,12 @@ html
448
+
div.comments
449
+
each comment in comments
450
+
div.comment(id=`${encodeURIComponent(comment.uri)}`)
451
+
- p
452
+
+ p.comment-info
453
+
a(href=`/u/${comment.authorDid}`)
454
+
| @#{didHandleMap[comment.authorDid]}
455
+
| ·
456
+
| #{timeDifference(now, Date.parse(paste.createdAt))} ago
457
+
- p
458
+
- pre.comment-body #{comment.body}
459
+
+ pre.comment-body #{comment.body}
460
+
461
+
if ownDid
462
+
form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form
463
+
--
464
+
2.47.0
465
+