MarkBind / markbind

MarkBind is a tool for generating content-heavy websites from source files in Markdown format
https://markbind.org/
MIT License
136 stars 124 forks source link

[Feature request] Tag (keywortd) support #2187

Open noraj opened 1 year ago

noraj commented 1 year ago

Please confirm that you have searched existing issues in the repo

Yes, I have searched the existing issues

Any related issues?

No response

What is the area that this feature belongs to?

Reader Usability

Is your feature request related to a problem? Please describe.

Feature idea

Adding tags (keywords) in frontmatter (meta-data) will generate a page referencing all pages containing this page.

Example:

In frontmatter you add (in YAML for example):

---
tags:
    - dev
    - python
---

So it will create an endpoint http://example.org/tags/dev and http://example.org/tags/python referencing, respectively, all pages containing the dev tag and the python tag.

Then on the page of the documentation where there is such a tags frontmatter, the page will contain some tag link #dev and #python respectively referencing the previously mentioned endpoints.

Example on my blog using Hexo:

image

Why

Imagine I want to build a hacking documentation with a tree like that (for, let's say, my OSCP exam preparation):

- Admin # Machines from the Admin network, containing a write-up for each machine
  - Machine 1 # tags: [eop,windows]
  - Machine 2 # tags: [network,linux]
  - ...
- Cheat sheets # for various topics
  - Elevation of Privilege # tags: [eop]
  - Metasploit # tags: [exploit]
  - MS SQL Server # tags: [mssql,windows]
  - Network # tags: [network]
  - PWK/OSCP Specific
  - Pivoting # tags: [pivoting,network]
  - ...
- Connectivity
  - Machines
  - PWK Lab
  - Remote desktop
  - ssh-hostkey # tags: [ssh]
- Dev # Machines from the Dev network, containing a write-up for each machine
  - Machine 1
  - Machine 2
  - ...
- Exam
  - Exam specific
  - ...
- IT # Machines from the IT network, containing a write-up for each machine
  - Machine 1
  - Machine 2
  - ...
- Public # Machines from the Public network, containing a write-up for each machine
  - Machine 1
  - Machine 2
  - ...
- Tools
  - Nmap # tags: [network,scanner]
  - John the ripper # tags: [cracking,password,hash]
  - gcc # tags: [compilation,exploit]
  - dnsrecon # tags: [osint,dns]
  - dnsenum # tags: [osint,dns]
  - cmsmap # tags: [cms,web]
  - ncat # tags: [backdoor,network,scanner]
  - recon-ng tags: [osint]
  - snmpwalk # tags: [snmp,network]
  - snmpbrute # tags: [snmp,network]
  - onesixtyone # tags: [snmp,network]
  - ...

So I want to be able to search for a keyword (tag) like snmp and see all machines write-up where I attacked snmp, all cheat sheets explaining snmp stuff, all tools I can use to exploit snmp, etc.

Without tag support this is impossible.

One could say: "But there is already the search feature parsing the content of pages" yeah but this is automatic and introduce a lot of false positive (content containing a keywork but not really about it) and false negative (content not containing the keywork but actually talking about it) when the tag feature will be manual so there will be only exact matches.

I could also provide argumentation Why this shouldn't be theme dependent or plugin based. Some big companies like Docker, Joomla, or the Mozilla foundation are using documentation with tags.

image

Describe the solution you'd like

tags in front-matter

Describe alternatives you've considered

No response

Additional context

No response

damithc commented 1 year ago

@noraj Thanks very much for this suggestion and the detailed explanation. We'll certainly consider it in future version of MarkBind. If you are using MarkBind currently, do let us know more about your use case so that we have a better idea about the context of your feature request.

noraj commented 1 year ago

I'm currently using Retype especialy because it has tags supports but I'm considering switching to MarkBind because Retype is closed source and has a limited number of page in its free tier. Use case example https://trove.raw.pm/

tlylt commented 1 year ago

Thank you @noraj for the feature request, seems reasonable and likely a desirable feature for blogs or educational websites. I have a tag functionality on my personal blog as well :)

This could be related to my previous suggestion (#1753) on making it easy to create some sort of aggregated pages via some exposed variables. At the moment, tag support is not provided by MarkBind, but (NOT IDEAL) I think it could possibly be done with some JavaScript/Nunjucks macros/boilerplate and manually writing out the tags/links. Regardless, we should find a way to provide either a plugin or at least some guidance on how this can be achieved with MarkBind conveniently.

noraj commented 1 year ago

Tags as well as categories are just a sub-division of the more general term Taxonomies. Tags and categories are just the most common and generic taxonomies. So many SSG implement taxonomies and then add some keywords, methods and frontmatter variable to have default built-in tags and categories support but the user is also able to build sooe custop categories. Some other SSG just implement generic taxonomies and it's up to the user to create tags or categories as a custom taxonomy. And some other SSG add tags and categories supports without giving the possibility to add custom taxonomies.

noraj commented 1 year ago

What about tags? People will add tags in front matter, those tags will be reflected / displayed on the page so it needs some CSS and template adjustments, and the need to create a tag archive page / endpoint (/tags) as well as a generator for tags page (listings all pages containing a tag, eg. /tag/example). The implementation of categoried is very similar.

ang-zeyu commented 1 year ago

I agree with having tags in frontmatter. UI wise, would having facet search (checkboxes) be another option to dedicated pages? The search could in turn be in a dropdown/modal/dedicated page.