Merge pull request #1851 from urbit/mp/nested-grants
grants: allow year subdirectories while preserving permalinks
commit38b0692e52f0c0ddfc071d9ad89051323795ddcd
author~sarlev-sarsen <tlatfcp@protonmail.com>
dateMon 24 Oct 2022, 11:54 (4 years ago)
parent5d77d015e97faa
content/grants/bitcoin-node-json-rpc-api-part-1.md → content/grants/2019/bitcoin-node-json-rpc-api-part-1.mdrenamed
The content is the same.
content/grants/bitcoin-node-json-rpc-api-part-2.md → content/grants/2019/bitcoin-node-json-rpc-api-part-2.mdrenamed
The content is the same.
content/grants/bitcoin-node-json-rpc-api-part-3.md → content/grants/2019/bitcoin-node-json-rpc-api-part-3.mdrenamed
The content is the same.
content/grants/bitcoin-node-json-rpc-api-part-4.md → content/grants/2019/bitcoin-node-json-rpc-api-part-4.mdrenamed
The content is the same.
content/grants/bitcoin-wallet-on-bridge.md → content/grants/2019/bitcoin-wallet-on-bridge.mdrenamed
The content is the same.
content/grants/escape.md → content/grants/2019/escape.mdrenamed
The content is the same.
content/grants/gall-api-documentation.md → content/grants/2019/gall-api-documentation.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-1.md → content/grants/2019/host-two-urbit-meetups-1.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-10.md → content/grants/2019/host-two-urbit-meetups-10.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-2.md → content/grants/2019/host-two-urbit-meetups-2.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-3.md → content/grants/2019/host-two-urbit-meetups-3.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-4.md → content/grants/2019/host-two-urbit-meetups-4.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-5.md → content/grants/2019/host-two-urbit-meetups-5.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-6.md → content/grants/2019/host-two-urbit-meetups-6.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-7.md → content/grants/2019/host-two-urbit-meetups-7.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-8.md → content/grants/2019/host-two-urbit-meetups-8.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-9.md → content/grants/2019/host-two-urbit-meetups-9.mdrenamed
The content is the same.
content/grants/ragnarok-online-on-urbit.md → content/grants/2019/ragnarok-online-on-urbit.mdrenamed
The content is the same.
content/grants/udon-syntax-highlighter.md → content/grants/2019/udon-syntax-highlighter.mdrenamed
The content is the same.
content/grants/unit-tests-for-json-parsing.md → content/grants/2019/unit-tests-for-json-parsing.mdrenamed
The content is the same.
content/grants/unit-tests-for-pure-algorithms.md → content/grants/2019/unit-tests-for-pure-algorithms.mdrenamed
The content is the same.
content/grants/unit-tests-for-sha-functions.md → content/grants/2019/unit-tests-for-sha-functions.mdrenamed
The content is the same.
content/grants/unit-tests-for-zuse-cryptographic-functions.md → content/grants/2019/unit-tests-for-zuse-cryptographic-functions.mdrenamed
The content is the same.
content/grants/a-book-about-urbit.md → content/grants/2020/a-book-about-urbit.mdrenamed
The content is the same.
content/grants/a-network-enabled-spatial-database-and-demonstration-app.md → content/grants/2020/a-network-enabled-spatial-database-and-demonstration-app.mdrenamed
The content is the same.
content/grants/antechamber.md → content/grants/2020/antechamber.mdrenamed
The content is the same.
content/grants/art-by-urbit.md → content/grants/2020/art-by-urbit.mdrenamed
The content is the same.
content/grants/bart-train-tracker-landscape-tile.md → content/grants/2020/bart-train-tracker-landscape-tile.mdrenamed
The content is the same.
content/grants/bitcoin-full-node-provider-and-wallet.md → content/grants/2020/bitcoin-full-node-provider-and-wallet.mdrenamed
The content is the same.
content/grants/bitcoin-key-derivation.md → content/grants/2020/bitcoin-key-derivation.mdrenamed
The content is the same.
content/grants/boston-t-train-tracker-landscape-tile.md → content/grants/2020/boston-t-train-tracker-landscape-tile.mdrenamed
The content is the same.
content/grants/calendar-ui.md → content/grants/2020/calendar-ui.mdrenamed
The content is the same.
content/grants/calendar.md → content/grants/2020/calendar.mdrenamed
The content is the same.
content/grants/content-saver.md → content/grants/2020/content-saver.mdrenamed
The content is the same.
content/grants/cta-train-tracker-landscape-tile.md → content/grants/2020/cta-train-tracker-landscape-tile.mdrenamed
The content is the same.
content/grants/display-eth-data.md → content/grants/2020/display-eth-data.mdrenamed
The content is the same.
content/grants/docker-image-for-cloud-container-orchestration.md → content/grants/2020/docker-image-for-cloud-container-orchestration.mdrenamed
The content is the same.
content/grants/ethereum-abi-parser.md → content/grants/2020/ethereum-abi-parser.mdrenamed
The content is the same.
content/grants/go-airlock-library.md → content/grants/2020/go-airlock-library.mdrenamed
The content is the same.
content/grants/haskell-airlock-library.md → content/grants/2020/haskell-airlock-library.mdrenamed
The content is the same.
content/grants/hoon-001-learner-efficiency-and-early-learner-resources.md → content/grants/2020/hoon-001-learner-efficiency-and-early-learner-resources.mdrenamed
The content is the same.
content/grants/host-three-college-university-urbit-meetups-1.md → content/grants/2020/host-three-college-university-urbit-meetups-1.mdrenamed
The content is the same.
content/grants/host-three-college-university-urbit-meetups-2.md → content/grants/2020/host-three-college-university-urbit-meetups-2.mdrenamed
The content is the same.
content/grants/host-three-college-university-urbit-meetups-3.md → content/grants/2020/host-three-college-university-urbit-meetups-3.mdrenamed
The content is the same.
content/grants/host-three-virtual-urbit-meetups.md → content/grants/2020/host-three-virtual-urbit-meetups.mdrenamed
The content is the same.
content/grants/links-in-urbit-reference-docs.md → content/grants/2020/links-in-urbit-reference-docs.mdrenamed
The content is the same.
content/grants/llelogram.md → content/grants/2020/llelogram.mdrenamed
The content is the same.
content/grants/matrices-in-hoon.md → content/grants/2020/matrices-in-hoon.mdrenamed
The content is the same.
content/grants/matrixriotim-bridge-bot.md → content/grants/2020/matrixriotim-bridge-bot.mdrenamed
The content is the same.
content/grants/open-street-maps-data-importation.md → content/grants/2020/open-street-maps-data-importation.mdrenamed
The content is the same.
content/grants/staff-the-urbit-help-desk-1.md → content/grants/2020/staff-the-urbit-help-desk-1.mdrenamed
The content is the same.
content/grants/staff-the-urbit-help-desk-2.md → content/grants/2020/staff-the-urbit-help-desk-2.mdrenamed
The content is the same.
content/grants/staff-the-urbit-helpdesk-west.md → content/grants/2020/staff-the-urbit-helpdesk-west.mdrenamed
The content is the same.
content/grants/the-complete-guide-to-gall-and-landscape.md → content/grants/2020/the-complete-guide-to-gall-and-landscape.mdrenamed
The content is the same.
content/grants/tor-nodes-relay-search-tile.md → content/grants/2020/tor-nodes-relay-search-tile.mdrenamed
The content is the same.
content/grants/typescript-airlock-library.md → content/grants/2020/typescript-airlock-library.mdrenamed
The content is the same.
content/grants/up-to-date-hoon-reference-card.md → content/grants/2020/up-to-date-hoon-reference-card.mdrenamed
The content is the same.
content/grants/urbian-a-customized-linux-distribution-for-urbit-appliances.md → content/grants/2020/urbian-a-customized-linux-distribution-for-urbit-appliances.mdrenamed
The content is the same.
content/grants/urbit-event-series.md → content/grants/2020/urbit-event-series.mdrenamed
The content is the same.
content/grants/urbit-explainer-video.md → content/grants/2020/urbit-explainer-video.mdrenamed
The content is the same.
content/grants/urbit-http-api-for-kotlin.md → content/grants/2020/urbit-http-api-for-kotlin.mdrenamed
The content is the same.
content/grants/urbit-http-api-for-rust.md → content/grants/2020/urbit-http-api-for-rust.mdrenamed
The content is the same.
content/grants/urbit-http-interface-java-edition.md → content/grants/2020/urbit-http-interface-java-edition.mdrenamed
The content is the same.
content/grants/urbit-http-library-for-ruby.md → content/grants/2020/urbit-http-library-for-ruby.mdrenamed
The content is the same.
content/grants/urbit-online-meetup.md → content/grants/2020/urbit-online-meetup.mdrenamed
The content is the same.
content/grants/urbit-ship-and-star-hosting-and-troubleshooting-docs.md → content/grants/2020/urbit-ship-and-star-hosting-and-troubleshooting-docs.mdrenamed
The content is the same.
content/grants/verifying-urbit-id-on-keybase.md → content/grants/2020/verifying-urbit-id-on-keybase.mdrenamed
The content is the same.
content/grants/web-scraper.md → content/grants/2020/web-scraper.mdrenamed
The content is the same.
content/grants/analytics-script.md → content/grants/2021/analytics-script.mdrenamed
The content is the same.
content/grants/authenticate-with-urbit.md → content/grants/2021/authenticate-with-urbit.mdrenamed
The content is the same.
content/grants/azimuth-cli.md → content/grants/2021/azimuth-cli.mdrenamed
The content is the same.
content/grants/bitcoin-wallet-maintenance.md → content/grants/2021/bitcoin-wallet-maintenance.mdrenamed
The content is the same.
content/grants/bridge-l2-revamp.md → content/grants/2021/bridge-l2-revamp.mdrenamed
The content is the same.
content/grants/clojure-urbit-client.md → content/grants/2021/clojure-urbit-client.mdrenamed
The content is the same.
content/grants/comprehensive-local-server-and-mum-explanation-video.md → content/grants/2021/comprehensive-local-server-and-mum-explanation-video.mdrenamed
The content is the same.
content/grants/contacts.md → content/grants/2021/contacts.mdrenamed
The content is the same.
content/grants/content-producer.md → content/grants/2021/content-producer.mdrenamed
The content is the same.
content/grants/cross-platform-desktop-urbit-app.md → content/grants/2021/cross-platform-desktop-urbit-app.mdrenamed
The content is the same.
content/grants/cypherscope-bot.md → content/grants/2021/cypherscope-bot.mdrenamed
The content is the same.
content/grants/educational-guide-todomvc-urbit-edition.md → content/grants/2021/educational-guide-todomvc-urbit-edition.mdrenamed
The content is the same.
content/grants/feed-aggregator.md → content/grants/2021/feed-aggregator.mdrenamed
The content is the same.
content/grants/graph-store-documentation-guide.md → content/grants/2021/graph-store-documentation-guide.mdrenamed
The content is the same.
content/grants/guide-to-s3.md → content/grants/2021/guide-to-s3.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-11.md → content/grants/2021/host-two-urbit-meetups-11.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-12.md → content/grants/2021/host-two-urbit-meetups-12.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-13.md → content/grants/2021/host-two-urbit-meetups-13.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-14.md → content/grants/2021/host-two-urbit-meetups-14.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-15.md → content/grants/2021/host-two-urbit-meetups-15.mdrenamed
The content is the same.
content/grants/host-two-urbit-meetups-16.md → content/grants/2021/host-two-urbit-meetups-16.mdrenamed
The content is the same.
content/grants/json-jet.md → content/grants/2021/json-jet.mdrenamed
The content is the same.
content/grants/login-with-urbit.md → content/grants/2021/login-with-urbit.mdrenamed
The content is the same.
content/grants/machine-learning.md → content/grants/2021/machine-learning.mdrenamed
The content is the same.
content/grants/market-interface.md → content/grants/2021/market-interface.mdrenamed
The content is the same.
content/grants/meetup-bom.md → content/grants/2021/meetup-bom.mdrenamed
The content is the same.
content/grants/minimal-urbit-os.md → content/grants/2021/minimal-urbit-os.mdrenamed
The content is the same.
content/grants/native-urbit.md → content/grants/2021/native-urbit.mdrenamed
The content is the same.
content/grants/network-explorer-data-pipeline-http-api.md → content/grants/2021/network-explorer-data-pipeline-http-api.mdrenamed
The content is the same.
content/grants/nuck-jet.md → content/grants/2021/nuck-jet.mdrenamed
The content is the same.
content/grants/overhaul-the-urbitorg-website.md → content/grants/2021/overhaul-the-urbitorg-website.mdrenamed
The content is the same.
content/grants/planet-sales.md → content/grants/2021/planet-sales.mdrenamed
The content is the same.
content/grants/pokur.md → content/grants/2021/pokur.mdrenamed
The content is the same.
content/grants/ra-debugging-tools.md → content/grants/2021/ra-debugging-tools.mdrenamed
The content is the same.
content/grants/ra-page-tracking.md → content/grants/2021/ra-page-tracking.mdrenamed
The content is the same.
content/grants/ra-segfaults.md → content/grants/2021/ra-segfaults.mdrenamed
The content is the same.
content/grants/ra-stack-overflow.md → content/grants/2021/ra-stack-overflow.mdrenamed
The content is the same.
content/grants/search-in-groups.md → content/grants/2021/search-in-groups.mdrenamed
The content is the same.
content/grants/send-emails-to-a-mailing-list.md → content/grants/2021/send-emails-to-a-mailing-list.mdrenamed
The content is the same.
content/grants/smol-future-sustained-knowledge-sharing-and-marketing.md → content/grants/2021/smol-future-sustained-knowledge-sharing-and-marketing.mdrenamed
The content is the same.
content/grants/speech-recognition.md → content/grants/2021/speech-recognition.mdrenamed
The content is the same.
content/grants/staff-the-urbit-helpdesk-east.md → content/grants/2021/staff-the-urbit-helpdesk-east.mdrenamed
The content is the same.
content/grants/static-site-generation.md → content/grants/2021/static-site-generation.mdrenamed
The content is the same.
content/grants/thread-documentation.md → content/grants/2021/thread-documentation.mdrenamed
The content is the same.
content/grants/translate-key-parts-of-urbitorg-into-german.md → content/grants/2021/translate-key-parts-of-urbitorg-into-german.mdrenamed
The content is the same.
content/grants/translate-key-parts-of-urbitorg-into-korean.md → content/grants/2021/translate-key-parts-of-urbitorg-into-korean.mdrenamed
The content is the same.
content/grants/translate-key-parts-of-urbitorg-into-norwegian.md → content/grants/2021/translate-key-parts-of-urbitorg-into-norwegian.mdrenamed
The content is the same.
content/grants/translate-key-parts-of-urbitorg-into-spanish.md → content/grants/2021/translate-key-parts-of-urbitorg-into-spanish.mdrenamed
The content is the same.
content/grants/try-urbit-website.md → content/grants/2021/try-urbit-website.mdrenamed
The content is the same.
content/grants/twitter-uv-extension.md → content/grants/2021/twitter-uv-extension.mdrenamed
The content is the same.
content/grants/ua-collaborative-text-editor.md → content/grants/2021/ua-collaborative-text-editor.mdrenamed
The content is the same.
content/grants/ua-filesharer.md → content/grants/2021/ua-filesharer.mdrenamed
The content is the same.
content/grants/ua-heads-up-poker.md → content/grants/2021/ua-heads-up-poker.mdrenamed
The content is the same.
content/grants/ua-invoice-system.md → content/grants/2021/ua-invoice-system.mdrenamed
The content is the same.
content/grants/ua-marketplace.md → content/grants/2021/ua-marketplace.mdrenamed
The content is the same.
content/grants/ucal-google-and-outlook-integration.md → content/grants/2021/ucal-google-and-outlook-integration.mdrenamed
The content is the same.
content/grants/urbit-api-for-elixir.md → content/grants/2021/urbit-api-for-elixir.mdrenamed
The content is the same.
content/grants/urbit-community-concierge-east-coast-2q2021.md → content/grants/2021/urbit-community-concierge-east-coast-2q2021.mdrenamed
The content is the same.
content/grants/urbit-community-concierge-east-coast.md → content/grants/2021/urbit-community-concierge-east-coast.mdrenamed
The content is the same.
content/grants/urbit-community-concierge-west-coast-2q2021.md → content/grants/2021/urbit-community-concierge-west-coast-2q2021.mdrenamed
The content is the same.
content/grants/urbit-community-concierge-west-coast.md → content/grants/2021/urbit-community-concierge-west-coast.mdrenamed
The content is the same.
content/grants/urbit-http-api-for-emacs-elisp.md → content/grants/2021/urbit-http-api-for-emacs-elisp.mdrenamed
The content is the same.
content/grants/urbit-http-api-for-python.md → content/grants/2021/urbit-http-api-for-python.mdrenamed
The content is the same.
content/grants/urbit-irc-bridge.md → content/grants/2021/urbit-irc-bridge.mdrenamed
The content is the same.
content/grants/urbit-lfs-filehosting.md → content/grants/2021/urbit-lfs-filehosting.mdrenamed
The content is the same.
content/grants/urbit-notes.md → content/grants/2021/urbit-notes.mdrenamed
The content is the same.
content/grants/urbit-react-cookbook.md → content/grants/2021/urbit-react-cookbook.mdrenamed
The content is the same.
content/grants/uturn.md → content/grants/2021/uturn.mdrenamed
The content is the same.
content/grants/uv-extension-library.md → content/grants/2021/uv-extension-library.mdrenamed
The content is the same.
content/grants/video-content-manager.md → content/grants/2021/video-content-manager.mdrenamed
The content is the same.
content/grants/volt-lightning-on-urbit.md → content/grants/2021/volt-lightning-on-urbit.mdrenamed
The content is the same.
content/grants/webrtc-gall-agent-and-external-app.md → content/grants/2021/webrtc-gall-agent-and-external-app.mdrenamed
The content is the same.
content/grants/~home-urbit.md → content/grants/2021/~home-urbit.mdrenamed
The content is the same.
content/grants/abacus.md → content/grants/2022/abacus.mdrenamed
The content is the same.
content/grants/app-engram.md → content/grants/2022/app-engram.mdrenamed
The content is the same.
content/grants/app-openbsd.md → content/grants/2022/app-openbsd.mdrenamed
The content is the same.
content/grants/app-store.md → content/grants/2022/app-store.mdrenamed
The content is the same.
content/grants/app-urvault.md → content/grants/2022/app-urvault.mdrenamed
The content is the same.
content/grants/app-uv-native-notificatons.md → content/grants/2022/app-uv-native-notificatons.mdrenamed
The content is the same.
content/grants/apprenticeship-extending-bitcoin.md → content/grants/2022/apprenticeship-extending-bitcoin.mdrenamed
The content is the same.
content/grants/apprenticeship-studio-collections.md → content/grants/2022/apprenticeship-studio-collections.mdrenamed
The content is the same.
content/grants/apprenticeship-studio-email.md → content/grants/2022/apprenticeship-studio-email.mdrenamed
The content is the same.
content/grants/astrolabe.md → content/grants/2022/astrolabe.mdrenamed
The content is the same.
content/grants/books-development.md → content/grants/2022/books-development.mdrenamed
The content is the same.
content/grants/books.md → content/grants/2022/books.mdrenamed
The content is the same.
content/grants/calendar-holium.md → content/grants/2022/calendar-holium.mdrenamed
The content is the same.
content/grants/chess-bounty.md → content/grants/2022/chess-bounty.mdrenamed
The content is the same.
content/grants/chronicle.md → content/grants/2022/chronicle.mdrenamed
The content is the same.
content/grants/communal-computing.md → content/grants/2022/communal-computing.mdrenamed
The content is the same.
content/grants/community-meetups.md → content/grants/2022/community-meetups.mdrenamed
The content is the same.
content/grants/cue.md → content/grants/2022/cue.mdrenamed
The content is the same.
content/grants/desk-import-export.md → content/grants/2022/desk-import-export.mdrenamed
The content is the same.
content/grants/digital-editor-MROB.md → content/grants/2022/digital-editor-MROB.mdrenamed
The content is the same.
content/grants/digital-storefront.md → content/grants/2022/digital-storefront.mdrenamed
The content is the same.
content/grants/dusko-valve.md → content/grants/2022/dusko-valve.mdrenamed
The content is the same.
content/grants/eth-provider.md → content/grants/2022/eth-provider.mdrenamed
The content is the same.
content/grants/eth-wallet.md → content/grants/2022/eth-wallet.mdrenamed
The content is the same.
content/grants/eyre-scry.md → content/grants/2022/eyre-scry.mdrenamed
The content is the same.
content/grants/faux.md → content/grants/2022/faux.mdrenamed
The content is the same.
content/grants/filesharer.md → content/grants/2022/filesharer.mdrenamed
The content is the same.
content/grants/full-stop.md → content/grants/2022/full-stop.mdrenamed
The content is the same.
content/grants/gather.md → content/grants/2022/gather.mdrenamed
The content is the same.
content/grants/general-web-permissions.md → content/grants/2022/general-web-permissions.mdrenamed
The content is the same.
content/grants/gnosis-safe.md → content/grants/2022/gnosis-safe.mdrenamed
The content is the same.
content/grants/go-urbit.md → content/grants/2022/go-urbit.mdrenamed
The content is the same.
content/grants/gora-apprentice.md → content/grants/2022/gora-apprentice.mdrenamed
The content is the same.
content/grants/herd.md → content/grants/2022/herd.mdrenamed
The content is the same.
content/grants/hoon-eval.md → content/grants/2022/hoon-eval.mdrenamed
The content is the same.
content/grants/hoon-markdown-library.md → content/grants/2022/hoon-markdown-library.mdrenamed
The content is the same.
content/grants/lexicon.md → content/grants/2022/lexicon.mdrenamed
The content is the same.
content/grants/loom-pointer-compression.md → content/grants/2022/loom-pointer-compression.mdrenamed
The content is the same.
content/grants/meld-memory.md → content/grants/2022/meld-memory.mdrenamed
The content is the same.
content/grants/membrane.md → content/grants/2022/membrane.mdrenamed
The content is the same.
content/grants/middleware-apprentice.md → content/grants/2022/middleware-apprentice.mdrenamed
The content is the same.
content/grants/minesweeper.md → content/grants/2022/minesweeper.mdrenamed
The content is the same.
content/grants/native-planet-2.md → content/grants/2022/native-planet-2.mdrenamed
The content is the same.
content/grants/nested-goals.md → content/grants/2022/nested-goals.mdrenamed
The content is the same.
content/grants/notifications-protocol.md → content/grants/2022/notifications-protocol.mdrenamed
The content is the same.
content/grants/olif.md → content/grants/2022/olif.mdrenamed
The content is the same.
content/grants/peat.md → content/grants/2022/peat.mdrenamed
The content is the same.
content/grants/persistent-memory.md → content/grants/2022/persistent-memory.mdrenamed
The content is the same.
content/grants/plug.md → content/grants/2022/plug.mdrenamed
The content is the same.
content/grants/pony-bounty.md → content/grants/2022/pony-bounty.mdrenamed
The content is the same.
content/grants/port-maintenance.md → content/grants/2022/port-maintenance.mdrenamed
The content is the same.
content/grants/port-to-hosting.md → content/grants/2022/port-to-hosting.mdrenamed
The content is the same.
content/grants/profiling.md → content/grants/2022/profiling.mdrenamed
The content is the same.
content/grants/qr-login.md → content/grants/2022/qr-login.mdrenamed
The content is the same.
content/grants/quorum.md → content/grants/2022/quorum.mdrenamed
The content is the same.
content/grants/regex-library.md → content/grants/2022/regex-library.mdrenamed
The content is the same.
content/grants/seguro-phase-2.md → content/grants/2022/seguro-phase-2.mdrenamed
The content is the same.
content/grants/seguro-prototype.md → content/grants/2022/seguro-prototype.mdrenamed
The content is the same.
content/grants/slam.md → content/grants/2022/slam.mdrenamed
The content is the same.
content/grants/slaw-scot-jets.md → content/grants/2022/slaw-scot-jets.mdrenamed
The content is the same.
content/grants/symmetric-routing.md → content/grants/2022/symmetric-routing.mdrenamed
The content is the same.
content/grants/trill-ufa.md → content/grants/2022/trill-ufa.mdrenamed
The content is the same.
content/grants/trove.md → content/grants/2022/trove.mdrenamed
The content is the same.
content/grants/urbit-forms.md → content/grants/2022/urbit-forms.mdrenamed
The content is the same.
content/grants/urbit-interface-framework.md → content/grants/2022/urbit-interface-framework.mdrenamed
The content is the same.
content/grants/urbitswap.md → content/grants/2022/urbitswap.mdrenamed
The content is the same.
content/grants/value-articles.md → content/grants/2022/value-articles.mdrenamed
The content is the same.
content/grants/volt-ui.md → content/grants/2022/volt-ui.mdrenamed
The content is the same.
content/grants/whom.md → content/grants/2022/whom.mdrenamed
The content is the same.
lib/lib.js+21−62
@@ -97,76 +97,35 @@ export function formatDateAndTime(dateTimeObject) {
9797
9898// Returns an array of unique grants categories
9999export function getGrantsCategories() {
100− const paths = fs.readdirSync(directories("grants"));
101− const uniqueCategories = paths
102− // Get only markdown files
103− .filter((path) => parse(path).ext === ".md")
104− // Parse frontmatter
105− .map((path) =>
106− matter(fs.readFileSync(join(directories("grants"), path)), options)
107− )
108− // Each markdown file has an array of categories. Collapse these arrays into one array.
109− .reduce((acc, metadata) => {
110− return [...acc, ...metadata.data.taxonomies.grant_category];
111− }, [])
112− // Deduplicate single array of categories such that the output is an array where each category is represented only once.
113− .reduce((acc, uniqueItem) => {
114− if (acc.includes(uniqueItem)) {
115− return acc;
116− }
117− return [...acc, uniqueItem];
118− }, []);
100+ const years = fs.readdirSync(directories("grants"), { withFileTypes: true }).filter((f) => f.isDirectory());
101+ const uniqueCategories = Array.from(new Set(years.map((yearDir) => {
102+ return fs.readdirSync(join(directories("grants"), yearDir.name), { withFileTypes: true })
103+ .filter((path) => parse(path.name).ext === ".md")
104+ .map((path) => matter(fs.readFileSync(join(directories("grants"), yearDir.name, path.name)), options))
105+ .flat()
106+ .reduce((acc, metadata) => {
107+ return [...acc, ...metadata.data.taxonomies.grant_category]
108+ }, [])
109+ }).flat()));
119110 return uniqueCategories;
120111}
121112
122113// Returns an array of unique grants types
114+
123115export function getGrantsTypes() {
124− const paths = fs.readdirSync(directories("grants"));
125− const uniqueTypes = paths
126− // Get only markdown files
127− .filter((path) => parse(path).ext === ".md")
128− // Parse frontmatter to JSON
129− .map((path) =>
130− matter(fs.readFileSync(join(directories("grants"), path)), options)
131− )
132− // Each markdown file has an array of types. Collapse these arrays into one array.
133− .reduce((acc, metadata) => {
134− return [...acc, ...metadata.data.taxonomies.grant_type];
135− }, [])
136− // Deduplicate single array of types such that the output is an array where each type is represented only once.
137− .reduce((acc, uniqueItem) => {
138− if (acc.includes(uniqueItem)) {
139− return acc;
140− }
141− return [...acc, uniqueItem];
142− }, []);
116+ const years = fs.readdirSync(directories("grants"), { withFileTypes: true }).filter((f) => f.isDirectory());
117+ const uniqueTypes = Array.from(new Set(years.map((yearDir) => {
118+ return fs.readdirSync(join(directories("grants"), yearDir.name), { withFileTypes: true })
119+ .filter((path) => parse(path.name).ext === ".md")
120+ .map((path) => matter(fs.readFileSync(join(directories("grants"), yearDir.name, path.name)), options))
121+ .flat()
122+ .reduce((acc, metadata) => {
123+ return [...acc, ...metadata.data.taxonomies.grant_type]
124+ }, [])
125+ }).flat()));
143126 return uniqueTypes;
144127}
145128
146−// Returns a number which represents how many grants are open, or uncompleted
147−export function getOpenGrantsCount() {
148− const paths = fs.readdirSync(directories("grants"));
149− const count = paths
150− // Get only markdown files
151− .filter((path) => parse(path).ext === ".md")
152− // Parse frontmatter to JSON
153− .map((path) =>
154− matter(fs.readFileSync(join(directories("grants"), path)), options)
155− )
156− // Count grants which are both uncompleted and not assigned
157− .reduce((acc, metadata) => {
158− if (
159− !metadata.data.extra.completed &&
160− !metadata.data.extra.canceled &&
161− metadata.data.extra.assignee?.[0] === ""
162− ) {
163− return acc + 1;
164− }
165− return acc;
166− }, 0);
167− return count;
168−}
169−
170129// Groups arrays into an array of arrays with 2 members
171130export const pair = (arr) =>
172131 arr.reduce(function (rows, key, index) {
pages/grants.js+20−13
@@ -15,6 +15,8 @@ import GrantPreview from "../components/GrantPreview";
1515import JoinGroup from "../components/JoinGroup";
1616import omit from "lodash.omit";
1717import { getGrantsCategories, getGrantsTypes } from "../lib/lib";
18+import fs from 'fs';
19+import { join } from 'path';
1820
1921function isArray(arr) {
2022 return Array.isArray(arr);
@@ -264,9 +266,8 @@ export default function Grants({ posts, categories, types, search }) {
264266 <h5 className="text-wall-600 font-semibold my-2">Programs</h5>
265267 <div className="flex flex-wrap items-center pb-2">
266268 <a
267− className={`badge-lg mr-2 ${
268− !type ? "bg-black text-white" : "bg-wall-100 text-wall-500"
269− }`}
269+ className={`badge-lg mr-2 ${!type ? "bg-black text-white" : "bg-wall-100 text-wall-500"
270+ }`}
270271 onClick={() => push((({ type, ...obj }) => obj)(router.query))}
271272 >
272273 All <div className="opacity-50 ml-2">{allCount}</div>
@@ -288,11 +289,10 @@ export default function Grants({ posts, categories, types, search }) {
288289 }
289290 return (
290291 <a
291− className={`badge-lg mr-2 ${
292− isOrIsIn(each, type)
293− ? activeBg
294− : "bg-wall-100 text-wall-500"
295− }`}
292+ className={`badge-lg mr-2 ${isOrIsIn(each, type)
293+ ? activeBg
294+ : "bg-wall-100 text-wall-500"
295+ }`}
296296 onClick={() => push({ ...router.query, type: each })}
297297 >
298298 {each}
@@ -365,11 +365,18 @@ export default function Grants({ posts, categories, types, search }) {
365365export async function getStaticProps() {
366366 const categories = getGrantsCategories();
367367 const types = getGrantsTypes();
368− const posts = getAllPosts(
369− ["title", "slug", "date", "description", "extra", "taxonomies"],
370− "grants",
371− "date"
372− );
368+ const basePath = join(process.cwd(), 'content/grants')
369+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
370+ const posts = years.map((year) => {
371+ return getAllPosts(
372+ ["title", "slug", "date", "description", "extra", "taxonomies"],
373+ `grants/${year.name}`,
374+ "date"
375+ )
376+ }).flat().sort((a, b) => {
377+ return a.title.toLowerCase().localeCompare(b.title.toLowerCase())
378+ });
379+
373380 return {
374381 props: {
375382 posts: posts,
pages/grants/[slug].js+17−5
@@ -18,6 +18,8 @@ import Header from "../../components/Header";
1818import Footer from "../../components/Footer";
1919import ob from "urbit-ob";
2020import { DateTime } from "luxon";
21+import fs from 'fs';
22+import { join } from 'path';
2123
2224export default function Grant({ post, markdown, search }) {
2325 const router = useRouter();
@@ -146,13 +148,18 @@ export default function Grant({ post, markdown, search }) {
146148 );
147149}
148150
149−//
150151export async function getStaticProps({ params }) {
152+ const basePath = join(process.cwd(), 'content/grants')
153+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
154+ const dir = years.find((year) => {
155+ const yearDir = fs.readdirSync(join(basePath, year.name), { 'withFileTypes': true });
156+ return yearDir.some((file) => file.name === `${params.slug}.md`)
157+ });
151158 const post = getPostBySlug(
152159 params.slug,
153160 ["title", "slug", "date", "description", "content", "extra", "taxonomies"],
154− "grants"
155− );
161+ `grants/${dir.name}`
162+ )
156163
157164 const markdown = JSON.stringify(Markdown.parse({ post }));
158165 return {
@@ -161,13 +168,18 @@ export async function getStaticProps({ params }) {
161168}
162169
163170export async function getStaticPaths() {
164− const posts = getAllPosts(["slug", "date"], "grants", "date");
171+ const basePath = join(process.cwd(), 'content/grants')
172+ const years = fs.readdirSync(basePath, { 'withFileTypes': true });
173+ const posts = years.filter((year) => year.isDirectory()).map((year) => {
174+ const yearDir = fs.readdirSync(join(basePath, year.name), { 'withFileTypes': true });
175+ return yearDir.filter((entry) => entry.isFile()).map((entry) => entry.name.replace(/\.md$/, ""))
176+ }).flat()
165177
166178 return {
167179 paths: posts.map((post) => {
168180 return {
169181 params: {
170− slug: post.slug,
182+ slug: post,
171183 },
172184 };
173185 }),
pages/index.js+9−1
@@ -376,7 +376,15 @@ export async function getStaticProps() {
376376 });
377377
378378 // Latest grants
379− const grants = getAllPosts(["extra", "taxonomies"], "grants", "date");
379+ const basePath = path.join(process.cwd(), 'content/grants')
380+ const years = fs.readdirSync(basePath, { 'withFileTypes': true }).filter((f) => f.isDirectory());
381+ const grants = years.map((year) => {
382+ return getAllPosts(
383+ ["title", "slug", "date", "description", "extra", "taxonomies"],
384+ `grants/${year.name}`,
385+ "date"
386+ )
387+ }).flat();
380388
381389 const grantNumbers = {
382390 starsAwarded: Math.floor(