From 40d12791c5645231e7156dd7620afb4395740b8f Mon Sep 17 00:00:00 2001 From: Hydrus Network Developer Date: Wed, 27 Apr 2022 19:43:24 -0500 Subject: [PATCH] New mermaid charts Updated the new mermaid chart content to something more IRL and brushed up the surrounding help text --- docs/advanced_parents.md | 112 ++++++++++++++++++++++---------------- docs/advanced_siblings.md | 25 ++++++--- docs/images/azur_hell.png | Bin 0 -> 6698 bytes 3 files changed, 81 insertions(+), 56 deletions(-) create mode 100644 docs/images/azur_hell.png diff --git a/docs/advanced_parents.md b/docs/advanced_parents.md index 911e13df..65e848ad 100644 --- a/docs/advanced_parents.md +++ b/docs/advanced_parents.md @@ -6,66 +6,84 @@ Tag parents let you automatically add a particular tag every time another tag is ## what's the problem? { id="the_problem" } -Tags often fall into certain heirarchies. Certain tags _always_ imply certain other tags, and it is annoying and time-consuming to add them all individually every time. +Tags often fall into certain heirarchies. Certain tags _always_ imply other tags, and it is annoying and time-consuming to type them all out individually every time. -For example, whenever you tag a file with _ak-47_, you probably also want to tag it _assault rifle_, and maybe even _firearm_ as well. +As a basic example, a `car` _is_ a `vehicle`. It is a _subset_. Any time you see a car, you also see a vehicle. Similarly, a `rifle` _is_ a `firearm`, `face tattoo` implies `tattoo`, and `species:pikachu` implies `species:pokémon` which also implies `series:pokémon`. -![](images/tag_parents_venn.svg) +Another way of thinking about this is considering what you would expect to see when you search these terms. If you search `vehicle`, you would expect the result to include _all_ `cars`. If you search `series:league of legends`, you would expect to see all instances of `character:ahri` (even if, on rare occasion, she were just appearing in cameo or in a crossover). -Another time, you might tag a file _character:eddard stark_, and then also have to type in _house stark_ and then _series:game of thrones_. (you might also think _series:game of thrones_ should actually be _series:a song of ice and fire_, but that is an issue for [siblings](advanced_siblings.md)) - -Drawing more relationships would make a significantly more complicated venn diagram, so let's draw a family tree instead: +For hydrus terms, `character x is in series y` is a common relationship, as is `costume x is of character y`: ```mermaid graph TB - got[series:game of thrones] - got --- stark[house stark] - got --- baratheon[house baratheon] - got --- lannister[house lannister] - got --- targaryen[house targaryen] - stark --- eddard[character:eddard stark] - stark ---- sansa[character:sansa stark] - stark ----- bran[character:bran stark] - baratheon --- robert[character:robert baratheon] - lannister --- cersei[character:cersei lannister] - lannister ---- jaime[character:jaime lannister] - targaryen --- daenerys[character:daenerys targaryen] + C[series:metroid] --- B[character:samus aran] --- A[character:zero suit samus] ``` -e.g. cersei lannister is a member of house lannister, which occurs in the series game of thrones. +In this instance, anything with `character:zero suit samus` would also have `character:samus aran`. Anything with `character:samus aran` (and thus anything with `character:zero suit samus`) would have `series:metroid`. + +Remember that the reverse is not true. Samus comes inextricably from Metroid, but not everything Metroid is Samus (e.g. a picture of just Ridley). + +Even a small slice of these relationships can get complicated: + +```mermaid +graph TB + A[studio:blizzard entertainment] + A --- B[series:overwatch] + B --- B1[character:dr. angela 'mercy' ziegler] + B1 --- B1b[character:pink mercy] + B1 --- B1c[character:witch mercy] + B --- B2[character:hana 'd.va' song] + B2 --- B2b["character:d.va (gremlin)"] + A --- C[series:world of warcraft] + C --- C1[character:jaina proudmoore] + C1 --- C1a[character:dreadlord jaina] + C --- C2[character:sylvanas windrunner] +``` + +Some franchises are bananas: + +![](images/azur_hell.png) + +Also, unlike siblings, which as we previously saw are `n->1`, some tags have more than one implication (`n->n`): + +```mermaid +graph TB + A[adjusting clothes] --- B[adjusting swimsuit] + C[swimsuit] --- B +``` + +`adjusting swimsuit` implies both a `swimsuit` and `adjusting clothes`. Consider how `adjusting bikini` might fit on this chart--perhaps this: + +```mermaid +graph TB + A[adjusting clothes] --- B[adjusting swimsuit] + A --- E[adjusting bikini] + C[swimsuit] --- B + F[bikini] --- E + D[swimwear] --- C + D --- F +``` + +Note this is not a loop--like with siblings, loops are not allowed--this is a family tree with three 'generations'. `adjusting bikini` is a child to both `bikini` and `adjusting clothes`, and `bikini` is a child to the new `swimwear`, which is also a parent to `swimsuit`. `adjusting bikini` and `adjusting swimsuit` are both grandchildren to `swimwear`. + +This can obviously get as complicated and autistic as you like, but be careful of being too confident. Reasonable people disagree on what is 'clearly' a parent or sibling, or what is an excessive level of detail (e.g. `person:scarlett johansson` may be `gender:female`, if you think that useful, but `species:human`, `species:mammal`, and `species:animal` may be going a little far). Beyond its own intellectual neatness, ask yourself the purpose of what you are creating. + +Of course you can create any sort of parent tags on your local tags or your own tag repositories, but this sort of thing can easily lead to arguments between reasonable people on a shared server like the PTR. + +Just like with normal tags, try not to create anything 'perfect' or stray away from what you actually search with, as it usually ends up wasting time. Act from need, not toward purpose. ## tag parents { id="tag_parents" } -Let's define the child-parent relationship 'C->P' as saying that tag P is the semantic superset/superclass of tag C. **All files that have C should also have P, without exception.** When the user tries to add tag C to a file, tag P is added automatically. +Let's define the child-parent relationship 'C->P' as saying that tag P is the semantic superset/superclass of tag C. **All files that have C should also have P, without exception.** -Let's expand our weapon example: +Any file that has C should appear to have P. Any search for P will include all of C implicitly. -```mermaid -graph TB - firearm --- rifle - firearm --- shotgun - firearm --- handgun - rifle --- assult[assult rifle] - rifle --- semi[semi-automatic rifle] - rifle --- bolt[bolt-action rifle] - assult --- ak-47 - assult --- ak-74 - assult --- m16 - assult --- m4 - semi --- ar-15 - bolt --- winchester70[winchester model 70] - shotgun ---- remington870[remington model 870] - remington --- remington870 - handgun ---- m1911 - handgun ---- sw10[smith & wesson model 10] - sw[smith and wesson] --- sw10 -``` +Tags can have multiple parents, and multiple tags have the same parent. Loops are not allowed. -Searching for any term should generally return all the files tagged with anything below. Note that a tag can have more than one parent. - -In that graph, adding _ar-15_ to a file would also add _semi-automatic rifle_, _rifle_, and _firearm_. Searching for _handgun_ would return everything with _m1911_ and _smith and wesson model 10_. - -This can obviously get as complicated and autistic as you like, but be careful of being too confident--this is just a fun example, but is an AK-47 truly _always_ an assault rifle? Some people would say no, and beyond its own intellectual neatness, what is the purpose of attempting to create such a complicated and 'perfect' tree? Of course you can create any sort of parent tags on your local tags or your own tag repositories, but this sort of thing can easily lead to arguments between reasonable people. I only mean to say, as someone who does a lot of tag work, to try not to create anything 'perfect', as it usually ends up wasting time. Act from need, not toward purpose. +!!! note + In hydrus, tag parents are _virtual_. P is not actually added to every file by C, it just appears as if it is. When you look at a file in _manage tags_, you will see the implication, just like you see how tags will be renamed by siblings, but you won't see the parent unless it actually happens to also be there as a 'hard' tag. If you remove a `C->P` parent relationship, all the implied P tags will disappear! + + It also takes a bunch of CPU to figure this stuff out. Please bear with this system, sometimes it can take time. ## how you do it { id="how_to_do_it" } @@ -110,4 +128,4 @@ Let's assume you want to search bunch of 'creator' tags on the PTR. What you wil * Then save a new favourite search of `[system:inbox, favourite:aesthetic art, limit:256]`. This search will deliver results with any of the child 'creator' tags, just like a big OR search, and real fast! -If you want to add or remove any creators to the 'aesthetic art' group, you can simply go back to _tags->manage tag parents_, and it will apply everywhere. You can create more umbrella/group tags if you like (and not just creators--think about clothing, or certain characters), and also use them in regular searches when you just want to browse some cool files. \ No newline at end of file +If you want to add or remove any creators to the 'aesthetic art' group, you can simply go back to _tags->manage tag parents_, and it will apply everywhere. You can create more umbrella/group tags if you like (and not just creators--think about clothing, or certain characters), and also use them in regular searches when you just want to browse some cool files. diff --git a/docs/advanced_siblings.md b/docs/advanced_siblings.md index 3eaf2b96..8dd3eabe 100644 --- a/docs/advanced_siblings.md +++ b/docs/advanced_siblings.md @@ -44,28 +44,35 @@ This relationship is transitive, which means as well as saying `A->B`, you can a ``` mermaid graph LR - A[murrikkka] --> B[united states] --> C[united states of america]; + A[lena_oxton] --> B[lena oxton] --> C[character:tracer]; ``` +In this case, everything with 'lena_oxton' or 'lena oxton' will show 'character:tracer' instead. + You can also have an `A->C` and `B->C` that does not include `A->B`. ```mermaid graph LR - boy --> male - man --> male + A[d.va] --> C[character:hana 'd.va' song] + B[hana song] --> C ``` -The outcome of these two arrangements is the same (everything ends up as C), but the underlying semantics are a little different if you ever want to edit them. +The outcome of these two arrangements is the same--everything ends up as C. -Many complicated arrangements are possible: +Many complicated arrangements are possible (and inevitable, as we try to merge many different communities' ideal tags): ```mermaid graph LR - A[Calvin Broadus] --> B[snoop doggy dogg] --> C[snoop dogg] --> D[snoop lion] - E[dj snoopadelic] --> D + A[angela_ziegler] --> B[angela ziegler] --> I[character:dr. angela 'mercy' ziegler] + C["angela_ziegler_(overwatch)"] --> B + D[character:mercy] --> I + E["character:mercy (overwatch)"] --> I + F[dr angela ziegler] --> I + G["character:マーシー(オーバーウォッチ)"] --> E + H[overwatch mercy] --> I ``` -Note that if you say `A->B`, you cannot say `A->C`; the left-hand side can only go to one. The right-hand side can receive many. The client will stop you from constructing loops. +Note that if you say `A->B`, you cannot also say `A->C`. This is an `n->1` relationship. Many things can point to a single ideal, but a tag cannot have more than one ideal. Also, obviously, these graphs are non-cyclic--no loops. ## how you do it { id="how_to_do_it" } @@ -87,4 +94,4 @@ Although the client may present A as B, it will secretly remember A! You can rem ## remote siblings { id="remote_siblings" } -Whenever you add or remove a tag sibling pair to a tag repository, you will have to supply a reason (like when you petition a tag). A janitor will review this petition, and will approve or deny it. If it is approved, all users who synchronise with that tag repository will gain that sibling pair. If it is denied, only you will see it. \ No newline at end of file +Whenever you add or remove a tag sibling pair to a tag repository, you will have to supply a reason (like when you petition a tag). A janitor will review this petition, and will approve or deny it. If it is approved, all users who synchronise with that tag repository will gain that sibling pair. If it is denied, only you will see it. diff --git a/docs/images/azur_hell.png b/docs/images/azur_hell.png new file mode 100644 index 0000000000000000000000000000000000000000..e7617a31b45a414516a6b12718d0dba2a22486ca GIT binary patch literal 6698 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 Ji{)Pg{Rg?KzZ3uf literal 0 HcmV?d00001