From d968da10a0cb34dbeaaaeb0dc5ea4adde2276e2f Mon Sep 17 00:00:00 2001 From: lqdev Date: Thu, 13 Jun 2024 21:18:41 +0200 Subject: [PATCH] refreshing pages & look and feel a bit hopefully the new :folder: and :page: icons help you navigate the hobby corners better --- content/about-treehouse.tree | 43 +-- content/about.tree | 253 ++++++++---------- content/about/v1.tree | 192 +++++++++++++ content/design.tree | 4 +- content/design/sidebars.tree | 2 +- content/games.tree | 9 +- content/music.tree | 6 +- content/music/fuck-drm.tree | 4 +- content/music/reviews.tree | 20 +- content/music/spotify.tree | 2 +- content/philosophy.tree | 4 +- content/programming.tree | 28 +- content/programming/languages/cxx.tree | 4 +- content/programming/opinions.tree | 12 +- .../technologies/unreal-engine.tree | 10 +- crates/treehouse/src/cli/serve.rs | 8 +- crates/treehouse/src/state.rs | 4 + crates/treehouse/src/tree.rs | 34 +++ crates/treehouse/src/tree/attributes.rs | 6 + static/emoji/clueless.png | Bin 0 -> 14077 bytes static/emoji/folder.svg | 4 + static/emoji/page.svg | 7 + static/emoji/rarog.png | Bin 0 -> 11145 bytes treehouse.toml | 1 + 24 files changed, 453 insertions(+), 204 deletions(-) create mode 100644 content/about/v1.tree create mode 100644 static/emoji/clueless.png create mode 100644 static/emoji/folder.svg create mode 100644 static/emoji/page.svg create mode 100644 static/emoji/rarog.png diff --git a/content/about-treehouse.tree b/content/about-treehouse.tree index 9188d39..2f807a3 100644 --- a/content/about-treehouse.tree +++ b/content/about-treehouse.tree @@ -145,7 +145,7 @@ + ### the treehouse is a mostly statically generated website % id = "01H89RFHCQ2GWJPTAKTRGS1QAC" - - weird poems and philosophical talk are over, it's time to focus on the tech. + + weird poems and philosophical talk are over, it's time to focus on the tech. % id = "01H8V55APDEF8WTQ3KFC7E9HWB" - call this an overview, Defense of Design, or what have you @@ -170,14 +170,14 @@ - (yes, I know that website is super old, but I still find it incredibly funny :hueh:) % id = "01H89RFHCQRA4BBBWDC8K68BB0" - - if you wanna browse the source code, feel free to [check it out on GitHub][def:treehouse/repo] + - if you wanna browse the source code, feel free to [check it out here][def:treehouse/repo] % id = "01H89RFHCQFWC2FWBAE9PVNC08" - as I alluded to [here][branch:01H89RFHCQ3EAP0F6PRSEK7S1T], treehouse is built to decay gracefully as you take away the fancy parts. % id = "01H8V55APDMPF3WFTNTFSYBQRF" - - you will be able to read it just fine without JavaScript, just that it'll be a little + + you will be able to read it just fine without JavaScript, just that it'll be a little less pleasant. % id = "01H8V55APD1RSSRMDZ3CEE9S9C" @@ -220,7 +220,7 @@ janky, but the content should still be fully readable. % id = "01H8V55APDWN8TV31K4SXBTTWB" - - myself, I'm writing this content in a bespoke format called `.tree`. + + myself, I'm writing this content in a bespoke format called `.tree`. % id = "01H8V55APDGX4EYV8W7ECXZ6FP" - the structure of `.tree` files is extremely minimal. there are only a few syntactic features to speak of. @@ -229,7 +229,7 @@ - here's a taste of `.tree`: % id = "01H8V55APD5686J8GTXP118V8E" - - ``` + - ```treehouse % id = "root" - this is a branch @@ -276,10 +276,10 @@ - …actually, that's a lie. see that code example above? Markdown code fences \`\`\` are handled specially to let embed `.tree` source code blocks within `.tree` files. that's all. % id = "01H8V55APDVQB6AD23Y6PZPPB8" - - you may have noticed in that code example above that almost every branch has an `id` attribute. + - every branch in the treehouse has a globally unique ID. % id = "01H8V55APD4H5JT8NTYCCTN77G" - - this is because I want every branch to be individually linkable and quotable. + + this is because I want every branch to be individually linkable and quotable. % id = "01H8V55APDPSZNP9AK7QRK62BG" - if you ever want to link anything I said in an argument online: hover over a branch, right-click that little _permalink_ icon that's on the right side of the screen, and _Copy Link_. @@ -288,7 +288,7 @@ - but manually coming up with ids for branches would be quite the nuisance. % id = "01H8V55APDXV0KRVEF9PTA72J7" - - that's why with the power of Tools Programming™, I built a tool that fills out all the ids for me. + + that's why with the power of Tools Programming™, I built a tool that fills out all the ids for me. % id = "01H8V55APD8VG7WE6JX5JBDJEC" - I chose [ulids](https://github.com/ulid/spec) for generated ids, for a few reasons: @@ -324,10 +324,20 @@ - which is cool because it's much denser while avoiding ambiguous characters - `0`, `O`, and `o` are all interpreted as `0` (zero). % id = "01H8V55APDXT064G9PA78JW0CM" - - noticed how fast the treehouse restores your state? there's basically no delay. + + noticed how fast the treehouse restores your state? there's basically no delay. % id = "01H8V55APDGS626M5Y6DDAS9ZE" - - this is because it restores your state _as it's loading in_, by using [Web Components](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements). + + this is because it restores your state _as it's loading in_, by using a [`MutationObserver`](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver). + + % id = "01J09E55GTGHTGJP3JQN1SY4BM" + - initially the treehouse used Web Components, but for Webkit compatibility reasons, I had to switch that out to a more bespoke solution. + + % redirect_here = ["01H8V55APD4V54M2EKQKQ4GNP8"] + id = "01J09E55GTFSQW46JSG3T3SSMQ" + - elements such as linked branches are implemented using _spells_, which are a custom framework for composing behaviors on top of existing elements. + + % id = "01J09E55GTHJXWRG0P9MADASRQ" + + in addition to that, many things on the treehouse are Web Components, which are another awesome API that lets you prepare the DOM as soon as everything is ready. % id = "01H8V55APD73AG65NP2VGX6169" - despite many people calling that API extremely low-level, I beg to differ. it's actually pretty easy and pleasant to use. @@ -335,20 +345,17 @@ % id = "01H8V55APDDHYNRZXQDEG0A242" - most importantly it lets me enhance vanilla `
  • ` elements with custom behavior executed on load, which I use to restore your reading progress as the page is loading in. - % id = "01H8V55APD4V54M2EKQKQ4GNP8" - - linked branches also use Web Components by the way. - % id = "01H8V55APDKY0HYEJM2C1CJHEG" - - while not strictly a technical topic, I'd like to shout out [Recursive](https://recursive.design) for being an awesome font :ralsei_love: + + while not strictly a technical topic, I'd like to shout out [Recursive](https://recursive.design) for being an awesome font :ralsei_love: % id = "01H8V55APD88JCQBQ4SHVCYR97" - (not to be confused with [Font Awesome](https://fontawesome.com/), which I do not use here. icon designs are my own.) % id = "01H8V55APD0S00ACN0YY7Y9MSW" - - being a variable font, I can tweak the text's look and feel on many different axes. + + being a variable font, I can tweak the text's look and feel on many different axes. % id = "01H8V55APDRG88JRV74MMDTV4J" - - the one that I wanted to shout out in particular is `CASL`, which lets me make it look a lot more happy and playful. + + the one that I wanted to shout out in particular is `CASL`, which lets me make it look a lot more happy and playful. % id = "01H8V55APDMP5FE9ZCMRACH18W" + almost like Comic Sans, but without all the stigma. @@ -363,7 +370,7 @@ - not everyone runs Windows or macOS, so just assuming the reader has Comic Sans installed isn't ideal. % id = "01H8V55APD2BPGQXEK7JARYJ9H" - - ~~in particular the variant on my website is 100% casual (`CASL`), and -2.0 slanted (`slnt`).~~ + + ~~in particular the variant on my website is 100% casual (`CASL`), and -2.0 slanted (`slnt`).~~ % id = "01H8V55APDXZJE3HHH5AQ8ZQHF" + that little bit of slant makes it look just a little more like handwriting. @@ -384,4 +391,4 @@ - not to mention I'd have to handwrite a lot of text, and *then* either use OCR or type it all out again for accessibility. yeah, no thanks methinks. % id = "01HRD97CSJSQN78SGM691B6PNQ" - - UPDATE: not slanted anymore. `slnt` is 0. + - NOTE: not slanted anymore. `slnt` is 0. diff --git a/content/about.tree b/content/about.tree index 7c7c0c4..b4aa5b8 100644 --- a/content/about.tree +++ b/content/about.tree @@ -1,192 +1,169 @@ %% title = "who that! (about me)" -% id = "01H89P3CH836K8WKQ9BPR6RE3C" -- hello! I am liquidex +% id = "01J09B2BZXJ989S2SGWBNZ397C" ++ hello! I am **liquidex**. - % id = "01H89P3CH8YZY1MTZS3DZGGFKX" - + also known as… + % id = "01J09B2BZX54T2GSP8H3D62S6J" + + also known as **liquidex** - % id = "01H89P3CH8GAHS8DDW1HHEWA3P" - - **liquidex** (just including this here for linking sake) + % id = "01J09B2BZXQ31FV1M3PMM6Q0GX" + - this is [the identity function](https://en.wikipedia.org/wiki/Identity_function) applied to my nickname - % id = "01H89P3CH8ER0M5WZBXQ292A2N" - - **liquidev** on various [programming-related platforms][def:social/github] + % id = "01J09B2BZX0R0AX5QHND6EBRFE" + - also known as **liquidev** on [various programming platforms][def:social/github] - % id = "01H89P3CH8943QGT52K7MRW12Q" - - **lqdev**, before I realized that name is taken. since then I use liquidev but you may see - this older name in some places + % id = "01J09B2BZXT6AAJNPEQ044KCDR" + - also known as **lqdev**, before I realized that name was taken. + you may notice this older name in some places. - % id = "01H89P3CH81FTHTQ552N7N1S3A" - - **daknus** [on SoundCloud][def:social/soundcloud] + % id = "01J09B2BZXBS2K6MRQYXFH43PW" + - also known as **daknus** [on SoundCloud][def:social/soundcloud]. + I use this as my music making alias. - % id = "01H89P3CH8PB76G26M4T8P6QDZ" - + **limiter** sometimes jokingly on Discord + % id = "01J09B2BZXAD196RA16JTY3K3T" + + also known as **limiter**? - % id = "01H89P3CH8Z4MXQ0C9EWV01DPX" - + **limitre**, which is British for limiter + % id = "01J09B2BZXNRYX758J5S00EZRG" + - or **limitre**, which is British for limiter. - % id = "01H89P3CH8P7HAGDJVGVWD96K7" - - y'know. like centre is British for center, metre is British for meter? :hueh: +% id = "01J09B2BZX25TN31D0F18YQPB2" ++ I'm a *he/him*-type cat person doing various stuff with computers - % id = "01H89P3CH8FA0JTX1TPRZV4BFM" - - before you ask, pronouns are _he/him_ + % id = "01J09B2BZXWB695M9XYF7CZ2ZF" + - > you said cat person, does that mean you don't like dogs? - % id = "01H89P3CH8A12NYRT3SC324Y2M" - - I'm a programmer from Poland + % id = "01J09E55G0QWS7X0YNBWRW222X" + - I prefer cats myself. though foxes are canids and I consider them pretty cute :smile: - % id = "01H89P3CH8VN1MPKS4RQFFW778" - + I work in the game industry + % id = "01J09E55G0MZ0WFQ3WC98YDDGT" + - > unless by *cat person* you mean… - % id = "01H89P3CH88PKW82498V91VZ4W" - + somehow my skills brought me to work as a game programmer at CD PROJEKT RED + % id = "01J09E55G0YWYMAP62Q7AM18BE" + + what? :clueless: - % id = "01H89P3CH8SPX5RZDWR00CZ436" - + not sure how that happened still so don't ask + % id = "01J09E55G09K80E6YE1T4E3KJJ" + - > y'know… like a *furry*? - % id = "01H8YJDNJFB2BGT0ASDNM8S4JJ" - - impostor syndrome going hard right now + % id = "01J09E55G0F5TVAK2MT80H598M" + + :clueless: - % id = "01H89P3CH8QSQY1M7TZVH1FYQM" - - but that game programming thing is just coincidence, in reality I love toying with - computers in general + % id = "01J09E55G0WS63QCFBPP12EMRM" + + … - % id = "01H89P3CH8TACWXWWZGGHQD2MK" - - so you may see me doing other random and weird stuff + % id = "01J09E55G0H58Q8V8NV23QSQGC" + - huh. you're still here? :ahyes: - % id = "01H89P3CH89P2Q9XGQD7BCF0R6" - - perhaps [compilers][def:stitchkit/repo] are one of those weird things + welcome to the club! - % id = "01H89P3CH8DYZHMQTGZDAEBNXN" - + or [audio][def:dawd3/repo] + unfortunately I've got no fursona to show off at this moment, please come back later. - % id = "01H89P3CH859AAGFEABN8EANSJ" - - my favorite part of that is blowing my own eardrums out with my math skill, which is rather *underdeveloped* so to speak +% id = "01J09B2BZX9QV3PM9YWPS628PJ" ++ I'm a game developer by trade :rarog: - % id = "01H89P3CH8R9WKSMMQVY0XARSF" - + heck even web development out of all things. I mean you're reading _my_ website right - now after all + % id = "01J09B2BZXNE1H2SXW9KSZK7Z5" + + I do various developer productivity-related stuff at CD PROJEKT RED, mostly focusing on the DX of delivering breathtaking games using the Unreal Engine. - % id = "01H89P3CH88M1GZ3WN3RXCW1NN" - - like truly *my my* website with *my own* backend, static generator, and all that + % id = "01J09B2BZX00X6A8Z6H4R16BDS" + - technically I don't really love *playing* big and serious games, but making one is a whole other challenge - a challenge of *scale*. + which is what really gets me going! - % id = "01H89P3CH8CFBVXBF5W3GYA70X" - - none of that pre-built stuff, this baby is generated from the *purest* samples - of Uranium-235 I could source +% id = "01J09B2BZXQKWYHC51D7QCJ6PF" +- other than game development, I program various other things… - % id = "01H89P3CH8HYM5XZRH56880TP5" - - … wait you're saying building your own nuclear reactor at home is illegal? UHHHHHHHHHH + % id = "01J09B2BZXRE1VPASMR52RWNTH" + - [compilers][def:stitchkit/repo], - % id = "01H89P3CH8EGD14MHJEET6MJ27" - - who knows at this point + % id = "01J09B2BZXYXA16X95H2JKDJNK" + + [audio][def:dawd3/repo], - % id = "01H89P3CH8RFRCTC500059H5G8" - - apart from programming I also take interest in other various things + % id = "01J09B2BZXY51P9D4BM8AADGYW" + - my favorite part of that is blowing out my own eardrums with my math skill, which is rather *underdeveloped* so to speak, - % id = "01H89P3CH864VWM4JXQ0N5C1YV" - - like video games + % id = "01J09B2BZX2P7XDH81BJ079PCP" + + [websites](/), - % id = "01H89P3CH8WK8F2XKBXFVE8KNX" - - yeah those are pretty great aren't they + % id = "01J09B2BZXN6GWK2JPC7YGT0E1" + + after all the treehouse is *my* website, with *my* own backend, static generator, *my* own design, [an only partially stolen color scheme](https://github.com/ayu-theme/ayu-colors), and most important, lots of fun stuff hidden underneath the surface. - % id = "01H89P3CH817HEVWCFHGJEGQHR" - - my faves are: + % id = "01J09B2BZXZAEPD36XG495WYFH" + + like have you wondered just how deep the rabbit hole goes? + I'm sure you can find some rather interesting easter eggs in there if you look hard enough. + who knows what you may find? - % id = "01H89P3CH8MHZMYKRFV30GSYWC" - - [A Hat in Time](https://hatintime.com) + % id = "01J09B2BZX0M925RBXR023XM6X" + - - % id = "01H89P3CH8G625Q1NQVT8CJ3K1" - - [DELTARUNE](https://deltarune.com) + % id = "01J09B2BZXX2R1TH10GGZC25KG" + + you name it. as long as it poses a cool and fun challenge, I'll be on it :verified: - % id = "01H89P3CH89TQ3SFG2Z40J29HX" - - they're pretty great you should check them out + % id = "01J09B2BZX5WED9XE2RAADFW8M" + - there's probably only one thing I *don't* like and it's backend web development. where did all the simplicity go? - % id = "01H89P3CH8AJATQ5DJBBFXJ1NH" - - or [music][page:music] + % id = "01J09B2BZXQQMPDYQJ052131GT" + - obviously treehouse is a very simple website with a very simple backend, but. seriously. + why do people have to make websites be so complicated. and slow. - % id = "01H89P3CH8XQ59YZD3RFRYQ2BM" - - various genres from electronic through jazz and even rock +% id = "01J09B2BZXS6NZKYS6CTWMG1QY" +- and other than programming, I do various other things… - % id = "01H89P3CH8V8H7BVWYTFHYQQTZ" - - in that order of priority + % id = "01J09B2BZXX9PFV33J591B3C9K" + + like video games! those are pretty great, aren't they? - % id = "01H89P3CH8ZMVBKS6CXGRB8QHB" - - electronic definitely leaning toward the more um, _eccentric_ side + % id = "01J09B2BZXDB8CZK0X6JMRMNR1" + + my favorites are :hueh: [A Hat in Time](https://hatintime.com) and :nap: [DELTARUNE](https://deltarune.com). + if you haven't played them yet, I highly recommend checking them out! - % id = "01H89P3CH836WYRR77815D8HCH" - - all you have to know is I listen to Venetian Snares pretty regularly + % id = "01J09B2BZX9CM8B5G42E2KYDBT" + - (you may wanna check out [UNDERTALE](https://undertale.com/) before you play Deltarune though.) - % id = "01H89P3CH8C719GX9CTK36FXXN" - + if you don't know what that means then good for you + % id = "01J09B2BZXYCRJDVJAVYT1P50P" + + [music][page:music] is also cool. + did you know I listen to a lot of [music][page:music]? + and I mean, [a lot of ][def:social/listenbrainz][music][page:music]! - % id = "01H8V55G7M7KEKBYX2D2RP9QQE" - + but if you so insist… [you have been warned](https://www.youtube.com/watch?v=BB7ExLcUuH0) + % id = "01J09B2BZX5C2KBA2ZC0X0YYD6" + - - % id = "01H8V55G7MWC7MQ9YQVDDFZ9QV" - - (this is one of the more crazy ones anyways. he makes some [more normal stuff](https://www.youtube.com/watch?v=IuI6MMUtNdU) too if you care) + % id = "01J09B2BZX39FGP634BM5HJ0FD" + + did I mention [music][page:music]? + I also ~~aspire to~~ [make ][def:social/soundcloud][music][page:music][ sometimes][def:social/soundcloud]. - % id = "01H89P3CH8XP6ZA1RWYVZWRXN3" - - jazz and rock I don't really know as well but I've been trying to broaden my - horizons a bit + % id = "01J09B2BZXGG5HYVYDNPVFRKY1" + - I say aspire because I'd really like to be better at it, but *time*, man… - % id = "01H89P3CH8EYKDYN83VPQQ088C" - + I really like artists who merge them with elements of electronic music + % id = "01J09B2BZXY6AN3242DYECK74Z" + + from time to time I also try to draw things, but *time*, it's killing me, man… - % id = "01H89P3CH8G5CFPME3Z88GNDD8" - - ~~while the music corner is under construction I can recommend [Elaenia by Floating Points](https://floatingpoints.bandcamp.com/album/elaenia) - as a good example of that~~ the music corner is no longer under construction. go [check it out][page:music]! + % id = "01J09B2BZXN3263NEHCKQ931TS" + - I'm sure one day you'll see the results of my practice, (unless you've already seen them :ralsei_wave:,) but for now I keep them largely to myself. - % id = "hello" - - feel free to come up to me and say hi! +% id = "hello" ++ if all that sounds like an interesting bunch of words, feel free to come up to me and say hi! - % id = "01H89P3CH823H89YQJKH9DWMW9" - - I would love to make some new friends :ralsei_love: + % id = "01J09B2BZXEVKP4AM4NJ0ZY8VJ" + - I'd love to make some new friends :ralsei_love: - % id = "01H89P3CH8ZQ11ABP0YW86APN7" - - in person I'm pretty much exactly as on this website lol + % id = "01J09B2BZXMMYDQG3SD6KK8M5H" + - you can reach out to me via - % id = "01H89P3CH8DHJC5BJMHVBMDAXS" - - like this website is literally meant to be a reflection of my personality and a literal braindump + % id = "01J09B2BZXZQSRXV8EHT68YE7M" + - Discord - username is [this][branch:01J09B2BZX54T2GSP8H3D62S6J] - % id = "01H89P3CH80XYPAHXH1QZJ9SMZ" - + so I type here like I would type on some chat platform. but it's a tree, just like Reddit! + % id = "01J09E55G1DB0RCJ2Z0DND38KF" + - Matrix - username is [this][branch:01J09B2BZXT6AAJNPEQ044KCDR] - % id = "01H8V55G7MS3NBPFFFKYE8YGFK" - - except on chat I don't capitalize "I" so if that pisses you off you may wanna brace yourself (or just tell me, I'll do my best to adapt) + % id = "01J09E55G1VQ1K14BZ1QW1X2CA" + + email - for people, it's under this domain and is `hi` - % id = "01H9DAJRZDNS9MSC9SK6HTEX2Z" - - and Reddit sucks! + % id = "01J09E55G1AE9HZZYV2A7S8FR7" + - if you're not a person you can, I dunno. + what do robots like doing? - % id = "01H89P3CH8CD28KGX9GVRFK60E" - - anyways you can find me on + % id = "01J09E55G1AGZ51ZV5ZGFMF78H" + - listen I'm trying to ward off spam with this weird wording, but I bet you can figure out my email adddress from this pretty easily. - % id = "01H89P3CH8EMM31JEMJRVRAKF4" - + Discord - username is [this][branch:01H89P3CH8GAHS8DDW1HHEWA3P] + % id = "01J09E55G1XKF12N27Y8TCMQPY" + - if not then my email is not that hard to find in other places. - % id = "01H89P3CH89HHDVHGB9GE287TR" - - I'm most active there so you'll have the best chance of getting a reply - - % id = "01H89P3CH8FBBJ6FKDCYDMD3T5" - - you'll know it's me if you see a profile with a fluffy boy avatar - - % id = "01H89P3CH8WTBKXP0GGN0HYQK2" - + Matrix - username is [this][branch:01H89P3CH8943QGT52K7MRW12Q] at gacko.pl - - % id = "01H89P3CH832E4GK0NJ77KED06" - - I try to be as active there as on Discord but my availability may be a little more - limited - - % id = "01H89P3CH8A31GJE0A0JTMK00B" - - just don't forget to wave at me when you do! I need to tell you apart from bots somehow - - % id = "01H89P3CH8R323RCDZAG6Y6C1X" - - my email for people is under this domain and is `hi` - - % id = "01H89P3CH8TAC5AB4QVA3E2Z0E" - - if you are not a person you can, I dunno. what do robots like doing? - - % id = "01H89P3CH8QTANJJ5F1E4GCBNK" - - listen I'm trying to ward off the spam with this weird wording but I bet you can - figure out my email address from this pretty easily - - % id = "01H89P3CH80QR285WFDTK5X5VF" - - if not then look at my GitHub it also has an email address + % id = "01J09E55G1T4PPVBXH7PSR8ZNY" + - just don't forget to wave at me if you do - I need to tell you apart from bots somehow! diff --git a/content/about/v1.tree b/content/about/v1.tree new file mode 100644 index 0000000..abf0848 --- /dev/null +++ b/content/about/v1.tree @@ -0,0 +1,192 @@ +%% title = "who that! (about me) (version 1, archived 2024-06-13)" + +% id = "01H89P3CH836K8WKQ9BPR6RE3C" +- hello! I am liquidex + + % id = "01H89P3CH8YZY1MTZS3DZGGFKX" + + also known as… + + % id = "01H89P3CH8GAHS8DDW1HHEWA3P" + - **liquidex** (just including this here for linking sake) + + % id = "01H89P3CH8ER0M5WZBXQ292A2N" + - **liquidev** on various [programming-related platforms][def:social/github] + + % id = "01H89P3CH8943QGT52K7MRW12Q" + - **lqdev**, before I realized that name is taken. since then I use liquidev but you may see + this older name in some places + + % id = "01H89P3CH81FTHTQ552N7N1S3A" + - **daknus** [on SoundCloud][def:social/soundcloud] + + % id = "01H89P3CH8PB76G26M4T8P6QDZ" + + **limiter** sometimes jokingly on Discord + + % id = "01H89P3CH8Z4MXQ0C9EWV01DPX" + + **limitre**, which is British for limiter + + % id = "01H89P3CH8P7HAGDJVGVWD96K7" + - y'know. like centre is British for center, metre is British for meter? :hueh: + + % id = "01H89P3CH8FA0JTX1TPRZV4BFM" + - before you ask, pronouns are _he/him_ + + % id = "01H89P3CH8A12NYRT3SC324Y2M" + - I'm a programmer from Poland + + % id = "01H89P3CH8VN1MPKS4RQFFW778" + + I work in the game industry + + % id = "01H89P3CH88PKW82498V91VZ4W" + + somehow my skills brought me to work as a game programmer at CD PROJEKT RED + + % id = "01H89P3CH8SPX5RZDWR00CZ436" + + not sure how that happened still so don't ask + + % id = "01H8YJDNJFB2BGT0ASDNM8S4JJ" + - impostor syndrome going hard right now + + % id = "01H89P3CH8QSQY1M7TZVH1FYQM" + - but that game programming thing is just coincidence, in reality I love toying with + computers in general + + % id = "01H89P3CH8TACWXWWZGGHQD2MK" + - so you may see me doing other random and weird stuff + + % id = "01H89P3CH89P2Q9XGQD7BCF0R6" + - perhaps [compilers][def:stitchkit/repo] are one of those weird things + + % id = "01H89P3CH8DYZHMQTGZDAEBNXN" + + or [audio][def:dawd3/repo] + + % id = "01H89P3CH859AAGFEABN8EANSJ" + - my favorite part of that is blowing my own eardrums out with my math skill, which is rather *underdeveloped* so to speak + + % id = "01H89P3CH8R9WKSMMQVY0XARSF" + + heck even web development out of all things. I mean you're reading _my_ website right + now after all + + % id = "01H89P3CH88M1GZ3WN3RXCW1NN" + - like truly *my my* website with *my own* backend, static generator, and all that + + % id = "01H89P3CH8CFBVXBF5W3GYA70X" + - none of that pre-built stuff, this baby is generated from the *purest* samples + of Uranium-235 I could source + + % id = "01H89P3CH8HYM5XZRH56880TP5" + - … wait you're saying building your own nuclear reactor at home is illegal? UHHHHHHHHHH + + % id = "01H89P3CH8EGD14MHJEET6MJ27" + - who knows at this point + + % id = "01H89P3CH8RFRCTC500059H5G8" + - apart from programming I also take interest in other various things + + % id = "01H89P3CH864VWM4JXQ0N5C1YV" + - like video games + + % id = "01H89P3CH8WK8F2XKBXFVE8KNX" + - yeah those are pretty great aren't they + + % id = "01H89P3CH817HEVWCFHGJEGQHR" + - my faves are: + + % id = "01H89P3CH8MHZMYKRFV30GSYWC" + - [A Hat in Time](https://hatintime.com) + + % id = "01H89P3CH8G625Q1NQVT8CJ3K1" + - [DELTARUNE](https://deltarune.com) + + % id = "01H89P3CH89TQ3SFG2Z40J29HX" + - they're pretty great you should check them out + + % id = "01H89P3CH8AJATQ5DJBBFXJ1NH" + - or [music][page:music] + + % id = "01H89P3CH8XQ59YZD3RFRYQ2BM" + - various genres from electronic through jazz and even rock + + % id = "01H89P3CH8V8H7BVWYTFHYQQTZ" + - in that order of priority + + % id = "01H89P3CH8ZMVBKS6CXGRB8QHB" + - electronic definitely leaning toward the more um, _eccentric_ side + + % id = "01H89P3CH836WYRR77815D8HCH" + - all you have to know is I listen to Venetian Snares pretty regularly + + % id = "01H89P3CH8C719GX9CTK36FXXN" + + if you don't know what that means then good for you + + % id = "01H8V55G7M7KEKBYX2D2RP9QQE" + + but if you so insist… [you have been warned](https://www.youtube.com/watch?v=BB7ExLcUuH0) + + % id = "01H8V55G7MWC7MQ9YQVDDFZ9QV" + - (this is one of the more crazy ones anyways. he makes some [more normal stuff](https://www.youtube.com/watch?v=IuI6MMUtNdU) too if you care) + + % id = "01H89P3CH8XP6ZA1RWYVZWRXN3" + - jazz and rock I don't really know as well but I've been trying to broaden my + horizons a bit + + % id = "01H89P3CH8EYKDYN83VPQQ088C" + + I really like artists who merge them with elements of electronic music + + % id = "01H89P3CH8G5CFPME3Z88GNDD8" + - ~~while the music corner is under construction I can recommend [Elaenia by Floating Points](https://floatingpoints.bandcamp.com/album/elaenia) + as a good example of that~~ the music corner is no longer under construction. go [check it out][page:music]! + + % id = "hello/v1" + - feel free to come up to me and say hi! + + % id = "01H89P3CH823H89YQJKH9DWMW9" + - I would love to make some new friends :ralsei_love: + + % id = "01H89P3CH8ZQ11ABP0YW86APN7" + - in person I'm pretty much exactly as on this website lol + + % id = "01H89P3CH8DHJC5BJMHVBMDAXS" + - like this website is literally meant to be a reflection of my personality and a literal braindump + + % id = "01H89P3CH80XYPAHXH1QZJ9SMZ" + + so I type here like I would type on some chat platform. but it's a tree, just like Reddit! + + % id = "01H8V55G7MS3NBPFFFKYE8YGFK" + - except on chat I don't capitalize "I" so if that pisses you off you may wanna brace yourself (or just tell me, I'll do my best to adapt) + + % id = "01H9DAJRZDNS9MSC9SK6HTEX2Z" + - and Reddit sucks! + + % id = "01H89P3CH8CD28KGX9GVRFK60E" + - anyways you can find me on + + % id = "01H89P3CH8EMM31JEMJRVRAKF4" + + Discord - username is [this][branch:01H89P3CH8GAHS8DDW1HHEWA3P] + + % id = "01H89P3CH89HHDVHGB9GE287TR" + - I'm most active there so you'll have the best chance of getting a reply + + % id = "01H89P3CH8FBBJ6FKDCYDMD3T5" + - you'll know it's me if you see a profile with a fluffy boy avatar + + % id = "01H89P3CH8WTBKXP0GGN0HYQK2" + + Matrix - username is [this][branch:01H89P3CH8943QGT52K7MRW12Q] at gacko.pl + + % id = "01H89P3CH832E4GK0NJ77KED06" + - I try to be as active there as on Discord but my availability may be a little more + limited + + % id = "01H89P3CH8A31GJE0A0JTMK00B" + - just don't forget to wave at me when you do! I need to tell you apart from bots somehow + + % id = "01H89P3CH8R323RCDZAG6Y6C1X" + - my email for people is under this domain and is `hi` + + % id = "01H89P3CH8TAC5AB4QVA3E2Z0E" + - if you are not a person you can, I dunno. what do robots like doing? + + % id = "01H89P3CH8QTANJJ5F1E4GCBNK" + - listen I'm trying to ward off the spam with this weird wording but I bet you can + figure out my email address from this pretty easily + + % id = "01H89P3CH80QR285WFDTK5X5VF" + - if not then look at my GitHub it also has an email address diff --git a/content/design.tree b/content/design.tree index f08886c..842b48e 100644 --- a/content/design.tree +++ b/content/design.tree @@ -22,8 +22,8 @@ this branch is about that. % content.link = "design/sidebars" id = "01HR9ZTS6T2ZBWGMJP8376NGX1" -+ sidebars ++ :page: sidebars % content.link = "design/digital-textures" id = "01HQ8JHZ5QTZXQW3M26CXPFQDF" -+ on digital textures ++ :page: on digital textures diff --git a/content/design/sidebars.tree b/content/design/sidebars.tree index f894d14..54ef44e 100644 --- a/content/design/sidebars.tree +++ b/content/design/sidebars.tree @@ -41,7 +41,7 @@ % id = "01HR9ZTS6PKYGVTFF0F78XVXH2" - (I'm not saying this structure is any better than a conventional blog though. it has its own set of challenges you need to take into account while writing, like *when to split*, and *when to nest*. - arguably, I still haven't learned how to write the treehouse well, but I think I'm getting better at it; compare [about][page:about] to this page and you'll see what I mean.) + arguably, I still haven't learned how to write the treehouse well, but I think I'm getting better at it; compare [about (version 1)][page:about/v1] to this page and you'll see what I mean.) % id = "01HR9ZTS6P484GD6Y9QR4TEGWD" - I'm glad most individuals' blogs are foregoing sidebars, but unfortunately I still regularly see them on various news sites and older blogs diff --git a/content/games.tree b/content/games.tree index bb3196b..53ec10d 100644 --- a/content/games.tree +++ b/content/games.tree @@ -1,5 +1,8 @@ % id = "01H9R1NKAXQMXWBA9Z65E4CG2T" -- sorry, nothing to see here in this section yet! ++ sorry, nothing to see here in this section yet! + + % id = "01J09B24M33NAE3D4VHKTR361J" + - (I'm just waiting for DELTARUNE Chapters 3 and 4 to come out to kickstart my theory-crafting) % id = "01H9R1NKAX7F0AEF374RWD4026" - it's just here for permalinking purposes. for now. @@ -8,7 +11,7 @@ - soon... I may put something here. % id = "games/oneshot" -+ ### OneShot ++ ### :page: OneShot % id = "01HA4HJKR3PBM0NJH7MZMYK6V9" - buy: [Steam](https://store.steampowered.com/app/420530/OneShot/) @@ -17,7 +20,7 @@ - on little cat feet % id = "games/the-talos-principle" -+ ### The Talos Principle ++ ### :page: The Talos Principle % id = "01H9R1NKAXN8NKBPYBEZASA1RA" - buy: [Steam](https://store.steampowered.com/app/257510/The_Talos_Principle/) diff --git a/content/music.tree b/content/music.tree index 5e8af89..4db1868 100644 --- a/content/music.tree +++ b/content/music.tree @@ -3,15 +3,15 @@ % content.link = "music/reviews" id = "01H969NN1BJYFYJJR0F458ACPN" -+ ### stuff I listen to ++ ### :folder: stuff I listen to % content.link = "music/fuck-drm" id = "01HPECQ3ZE1YKC1FS2X23H77R2" -+ ### fuck DRM ++ ### :folder: fuck DRM % content.link = "music/spotify" id = "01HVNX7FMW6KJC9H3CQ7TX8ST6" -+ ### Spotify ++ ### :folder: Spotify % id = "01H969NN1BR7BH7M7SXBPGB0WC" - in the future this section may grow another branch related to music making. diff --git a/content/music/fuck-drm.tree b/content/music/fuck-drm.tree index 3c95030..20fda54 100644 --- a/content/music/fuck-drm.tree +++ b/content/music/fuck-drm.tree @@ -7,7 +7,7 @@ - I'm aware they know *very well* what they're doing. just, y'know, *fuck them.* % id = "01HPWEESFV7TPXA6H5BCZVZKD6" -+ exhibit 2: ODDTAXI soundtrack ++ :page: exhibit 2: ODDTAXI soundtrack % id = "01HPWEESFVY5WGP5NY94QXFQ2A" - I watched this anime recently and I really liked the soundtrack, so I thought to myself "cool, gotta buy it and enjoy it in glorious FLAC while I'm driving my ~~taxi~~ car" @@ -32,7 +32,7 @@ They handle my payments. the money goes to the artists. and all the parties involved are happy! % id = "01HPECQ3Z1SG5J6Y12TD2E4Q1B" -+ exhibit 1: The Flashbulb's music is gone from Spotify ++ :page: exhibit 1: The Flashbulb's music is gone from Spotify % id = "01HPECQ3Z10FVJTAKE90W57X7R" - today I went to listen to some good ol'e Benn Jordan The Flashbulb at work, and guess what do I see? diff --git a/content/music/reviews.tree b/content/music/reviews.tree index fd4a2ac..84ac63e 100644 --- a/content/music/reviews.tree +++ b/content/music/reviews.tree @@ -1,3 +1,7 @@ +% id = "01J09B24KXE16SKSHFTWPE5AM9" +- NOTE: I haven't updated this branch in a while because I kind of got bored of doing music reviews. +however the content's still here if you wanna read it + % id = "01H969NN1B0752RC4VSEEK1CAT" + here you can find my thoughts on music I listen to @@ -39,44 +43,44 @@ % id = "music/album/aphex-twin/syro" content.link = "music/reviews/aphex-twin/syro" -+ ### album: Aphex Twin - Syro ++ ### :page: album: Aphex Twin - Syro % id = "music/album/radiohead/a-moon-shaped-pool" content.link = "music/reviews/radiohead/a-moon-shaped-pool" -+ ### album: Radiohead - A Moon Shaped Pool ++ ### :page: album: Radiohead - A Moon Shaped Pool % id = "music/album/radiohead/ok-computer" content.link = "music/reviews/radiohead/ok-computer" -+ ### album: Radiohead - OK Computer ++ ### :page: album: Radiohead - OK Computer % id = "music/album/telefon-tel-aviv/map-of-what-is-effortless" content.link = "music/reviews/telefon-tel-aviv/map-of-what-is-effortless" -+ ### album: Telefon Tel Aviv - Map of What Is Effortless ++ ### :page: album: Telefon Tel Aviv - Map of What Is Effortless % id = "01H9R1NKBDKVKZ2515CJJ2G8HJ" + the following albums I haven't had time to review yet, but I'm including them here for permalinking in case I do review them in the future % id = "music/album/aphex-twin/drukqs" content.link = "music/reviews/aphex-twin/drukqs" - + ### album: Aphex Twin - drukQs + + ### :page: album: Aphex Twin - drukQs % id = "01H9JB094GTG1TJ029CQ4PNMS0" - buy: [Bandcamp](https://aphextwin.bandcamp.com/album/drukqs) % id = "music/album/the-flashbulb/our-simulacra" - + ### album: The Flashbulb - Our Simulacra + + ### :page: album: The Flashbulb - Our Simulacra % id = "01H9R1NKBD8JA76ZBEFTJ62XV0" - buy: [Bandcamp](https://theflashbulb.bandcamp.com/album/our-simulacra) % id = "music/album/radiohead/hail-to-the-thief" - + ### album: Radiohead - Hail to the Thief + + ### :page: album: Radiohead - Hail to the Thief % id = "01H969NN1B6W19ENMTBJ0D48AF" - buy: [Bandcamp](https://radiohead.bandcamp.com/album/hail-to-the-thief) % id = "music/album/radiohead/the-king-of-limbs" - + ### album: Radiohead - The King of Limbs + + ### :page: album: Radiohead - The King of Limbs % id = "01H9JB094HBXF1G48ZME4WV2JA" - buy: [Bandcamp](https://radiohead.bandcamp.com/album/the-king-of-limbs) diff --git a/content/music/spotify.tree b/content/music/spotify.tree index a4ee89d..c72cb0e 100644 --- a/content/music/spotify.tree +++ b/content/music/spotify.tree @@ -12,7 +12,7 @@ from a consumer standpoint it's also really nice for discovering new music, because you don't have to pay a large amount just to give a listen to an album you may not end up liking. % id = "01HVNX7FMSR6TFJK3A9VVQ667K" -- a couple days ago I've noticed the queue in the desktop app has changed... +- :page: a couple days ago I've noticed the queue in the desktop app has changed... % id = "01HVNX7FMSREB52W6J2D8EYK7W" - this is how it looks now: diff --git a/content/philosophy.tree b/content/philosophy.tree index e2a1cce..09521bf 100644 --- a/content/philosophy.tree +++ b/content/philosophy.tree @@ -16,7 +16,7 @@ of a a "this is interesting" than "I disagree with this" vibe % id = "01HFYZKREV634J021ZMCDSP7G4" -+ hedonic treadmill ([wikipedia](https://en.wikipedia.org/wiki/Hedonic_treadmill)) ++ :page: hedonic treadmill ([wikipedia](https://en.wikipedia.org/wiki/Hedonic_treadmill)) % id = "01HFYZKREVV2CX1GYJQ18BJS78" + a concept that's incredibly useful in keeping it cool @@ -37,7 +37,7 @@ it then. % id = "01HREVZNAHB1H9VMD0NPPFTEQ0" -+ just shut up sometimes ++ :page: just shut up sometimes % id = "01HREVZNAH8XFRMVB9G58TPV8R" - I just caught myself writing a few paragraphs long comment on [Lobsters](https://lobste.rs) without really understanding what the author of the comment meant in the broader context of the discussion, diff --git a/content/programming.tree b/content/programming.tree index ecc4079..cfcfe6c 100644 --- a/content/programming.tree +++ b/content/programming.tree @@ -4,44 +4,44 @@ % id = "01H8Y427B4WC1CF9RHPZPXE77W" - and also more than just bit magic but I like how that sounds -% id = "programming/projects" - content.link = "programming/projects" -+ ### projects - % id = "01HPD4XQQ5GPQ20C6BPA8G670F" -- ### blog +- ### :folder: blog % content.link = "programming/blog/tairu" id = "01HPD4XQQ5WM0APCAX014HM43V" - + featured tairu - an interactive exploration of 2D autotiling techniques + + :page: featured tairu - an interactive exploration of 2D autotiling techniques % content.link = "programming/blog/lvalues" id = "01HY5R1ZW0M0Y5KQ1E8F0Q73ZT" - + places, or what is up with `*x` not always meaning the same thing + + :page: places, or what is up with `*x` not always meaning the same thing % content.link = "programming/blog/or-types" id = "01HTWN4XB2YMF3615BE8V6Y76A" - + OR-types + + :page: OR-types + +% id = "programming/projects" + content.link = "programming/projects" ++ ### :folder: projects % id = "01HRG2RJCNKT9JJJVQ8WVRC9CA" -- ### languages +- ### :folder: languages % content.link = "programming/languages/cxx" id = "programming/languages/cxx" - + ### C++ + + #### :folder: C++ % content.link = "programming/languages/lua" id = "programming/languages/lua" - + ### Lua + + #### :page: Lua % id = "01HRG2RJCN8J42NK0KWD3SBSJA" -- ### technologies +- ### :folder: technologies % content.link = "programming/technologies/unreal-engine" id = "programming/technologies/unreal-engine" - + ### Unreal Engine + + #### :folder: Unreal Engine % content.link = "programming/opinions" id = "programming/opinions" -+ ### opinions ++ ### :folder: opinions diff --git a/content/programming/languages/cxx.tree b/content/programming/languages/cxx.tree index d9f4030..a9c1517 100644 --- a/content/programming/languages/cxx.tree +++ b/content/programming/languages/cxx.tree @@ -1,8 +1,10 @@ +%% title = "C++" + % id = "01H9R1KJESR2F420HE67HW4AVR" - design lessons from the best programming language of all time that everyone loves (not really) % id = "programming/cxx/access-modifiers-as-labels" -+ access modifiers as labels (`private:`, `protected:`, and `public:`) ++ :page: access modifiers as labels (`private:`, `protected:`, and `public:`) % id = "01H9R1KJES39Z6RBCKY4E71PYD" - although Java and C#'s approach to symbol privacy may be verbose, it has one great advantage: it is stateless. diff --git a/content/programming/opinions.tree b/content/programming/opinions.tree index e943b6a..86e39a0 100644 --- a/content/programming/opinions.tree +++ b/content/programming/opinions.tree @@ -4,7 +4,7 @@ - > "Hotland - Bad Opinion Zone" % id = "01HBTSXTTAMWJ2BM6395YS72FN" -+ log verbosity levels are stupid ++ :page: log verbosity levels are stupid % id = "01HBTSXTTA946PJ04NN50P393T" - because when should you use any log level other than `error`, `warn`, or `info`? @@ -60,7 +60,7 @@ - I have no clue how well that will work but it would be pretty interesting % id = "01HBTSXTTASQDZK2HMCZXR3JJ4" -+ tracing is better than logging ++ :page: tracing is better than logging % id = "01HBTSXTTA08SCA313HSFWB13T" - information about time spans is very valuable for profiling @@ -89,7 +89,7 @@ be a worthwhile thing to do % id = "01HCD90XT3G0J8G9Y48H5QT1GJ" -+ don't use [`RefCell`](https://doc.rust-lang.org/std/cell/struct.RefCell.html) ++ :page: don't use [`RefCell`](https://doc.rust-lang.org/std/cell/struct.RefCell.html) % id = "01HCD90XT3X82R37WTJJABZF4Y" + usually if you have to resort to `RefCell`, it means something is wrong with your architecture @@ -149,7 +149,7 @@ drop the temporary `Ref<'b, T>` guard after the expression ends % id = "01HCG7KTGGAFS07QYJXZG6WHJJ" -+ `None` or `Invalid` cases in enums are a bad idea ++ :page: `None` or `Invalid` cases in enums are a bad idea % id = "01HCG7KTGGHWTT1ME9GQ5VPFPR" - by having them, you're forcing your users into an API that forces them to think about the @@ -163,7 +163,7 @@ to represent a possibly-invalid case % id = "01HPEMVAH9JZWYPVN53GVFQNQY" -+ NaNs should crash the program ++ :page: NaNs should crash the program % id = "01HPEMVAH97PDHJJS70SKG5VMN" - any time I see a NaN I cry inside knowing how much pain debugging it's gonna be. @@ -178,7 +178,7 @@ - worst case scenario you pull a Rust and disable those checks on release mode. that *does* work, but I don't like the idea of disabling numeric safety checks on release mode either. % id = "01HPEQ01JRMM17Y30BP7ZFKZRJ" -+ operator overloading is good, but getters and setters are not ++ :page: operator overloading is good, but getters and setters are not % id = "01HPEQ01JR57B057439SY90BQ9" - this one stems from an argument I had today, so I'll write my thoughts for future generations' enjoyment here diff --git a/content/programming/technologies/unreal-engine.tree b/content/programming/technologies/unreal-engine.tree index 39e116a..8fbf9af 100644 --- a/content/programming/technologies/unreal-engine.tree +++ b/content/programming/technologies/unreal-engine.tree @@ -1,3 +1,5 @@ +%% title = "Unreal Engine" + % id = "01H8Y0CKD0ZDHAH1ET3BJNDS4E" - this is that really cool game engine I work with on a daily basis @@ -9,16 +11,16 @@ % id = "programming/technologies/unreal-engine/blueprint" content.link = "programming/technologies/unreal-engine/blueprint" -+ ### thoughts on Blueprint ++ ### :page: thoughts on Blueprint % id = "01HP1FESY5WVJG4X80AZ4ZBX5D" -- ### random but cool things +- ### :folder: random but cool things % content.link = "programming/technologies/unreal-engine/generated-body" id = "01HV1DGFHP6GB268MDGGDXMR12" - + how does `GENERATED_BODY()` work exactly? + + :page: how does `GENERATED_BODY()` work exactly? % content.link = "programming/technologies/unreal-engine/fixes" id = "01HP1FESY5ZS6YTZXA8QTT5V1Z" - + data validation quick fixes + + :page: data validation quick fixes diff --git a/crates/treehouse/src/cli/serve.rs b/crates/treehouse/src/cli/serve.rs index 6ab4ef2..f0138c6 100644 --- a/crates/treehouse/src/cli/serve.rs +++ b/crates/treehouse/src/cli/serve.rs @@ -160,7 +160,13 @@ async fn sandbox(State(state): State>) -> Response { async fn branch(RawQuery(named_id): RawQuery, State(state): State>) -> Html { if let Some(named_id) = named_id { - if let Some(&branch_id) = state.treehouse.branches_by_named_id.get(&named_id) { + let branch_id = state + .treehouse + .branches_by_named_id + .get(&named_id) + .copied() + .or_else(|| state.treehouse.branch_redirects.get(&named_id).copied()); + if let Some(branch_id) = branch_id { let branch = state.treehouse.tree.branch(branch_id); if let Source::Tree { input, tree_path } = state.treehouse.source(branch.file_id) { let file_path = state.target_dir.join(format!("{tree_path}.html")); diff --git a/crates/treehouse/src/state.rs b/crates/treehouse/src/state.rs index 4ec4e27..fb1e555 100644 --- a/crates/treehouse/src/state.rs +++ b/crates/treehouse/src/state.rs @@ -43,6 +43,8 @@ pub struct Treehouse { pub branches_by_named_id: HashMap, pub roots: HashMap, + pub branch_redirects: HashMap, + missingno_generator: ulid::Generator, } @@ -56,6 +58,8 @@ impl Treehouse { branches_by_named_id: HashMap::new(), roots: HashMap::new(), + branch_redirects: HashMap::new(), + missingno_generator: ulid::Generator::new(), } } diff --git a/crates/treehouse/src/tree.rs b/crates/treehouse/src/tree.rs index ee11f9a..d80280f 100644 --- a/crates/treehouse/src/tree.rs +++ b/crates/treehouse/src/tree.rs @@ -166,6 +166,8 @@ impl SemaBranch { attributes.id ); + let redirect_here = attributes.redirect_here.clone(); + let branch = Self { file_id, indent_level: branch.indent_level, @@ -210,6 +212,38 @@ impl SemaBranch { ) } + for source_branch_named_id in redirect_here { + if let Some(old_branch_id) = treehouse + .branch_redirects + .insert(source_branch_named_id.clone(), new_branch_id) + { + let new_branch = treehouse.tree.branch(new_branch_id); + let old_branch = treehouse.tree.branch(old_branch_id); + + treehouse.diagnostics.push( + Diagnostic::warning() + .with_code("sema") + .with_message(format!( + "two branches serve as redirect targets for `{source_branch_named_id}`" + )) + .with_labels(vec![ + Label { + style: LabelStyle::Primary, + file_id, + range: new_branch.kind_span.clone(), + message: String::new(), + }, + Label { + style: LabelStyle::Primary, + file_id: old_branch.file_id, + range: old_branch.kind_span.clone(), + message: String::new(), + }, + ]), + ) + } + } + new_branch_id } diff --git a/crates/treehouse/src/tree/attributes.rs b/crates/treehouse/src/tree/attributes.rs index 025195c..8fbf2f9 100644 --- a/crates/treehouse/src/tree/attributes.rs +++ b/crates/treehouse/src/tree/attributes.rs @@ -61,6 +61,12 @@ pub struct Attributes { #[serde(default)] pub id: String, + /// Redirect old and deleted listed in the list to this branch. + /// + /// This can be used to keep links permanent even in case the structure of the treehouse changes. + #[serde(default)] + pub redirect_here: Vec, + /// Controls how the block should be presented. #[serde(default)] pub content: Content, diff --git a/static/emoji/clueless.png b/static/emoji/clueless.png new file mode 100644 index 0000000000000000000000000000000000000000..c30b9573f2cfce393c47a65dec7f30e1b0a9960a GIT binary patch literal 14077 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 literal 0 HcmV?d00001 diff --git a/static/emoji/folder.svg b/static/emoji/folder.svg new file mode 100644 index 0000000..cc61bdf --- /dev/null +++ b/static/emoji/folder.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/emoji/page.svg b/static/emoji/page.svg new file mode 100644 index 0000000..b8a4cb9 --- /dev/null +++ b/static/emoji/page.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/emoji/rarog.png b/static/emoji/rarog.png new file mode 100644 index 0000000000000000000000000000000000000000..f94dd71ea10ae45d7ed00a81e4ab244535c41873 GIT binary patch literal 11145 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 literal 0 HcmV?d00001 diff --git a/treehouse.toml b/treehouse.toml index ca739a0..e3950f3 100644 --- a/treehouse.toml +++ b/treehouse.toml @@ -15,6 +15,7 @@ description = "a place on the Internet I like to call home" # Social garbage "social/github" = "https://github.com/liquidev" "social/soundcloud" = "https://soundcloud.com/daknus" +"social/listenbrainz" = "https://listenbrainz.org/user/liquidev/" # My own repositories "stitchkit/repo" = "https://github.com/abyteintime/stitchkit"