mirror of
https://github.com/sayanarijit/xplr
synced 2024-11-14 18:12:54 +00:00
e0d683b13a
* Add xplr.util.lscolor and xplr.util.paint (#569) * Add xplr.util.lscolor and xplr.util.style * Fix formatting * Fix clippy suggestions * Remove redundant closures * Optimize, support NO_COLOR, and rename style to paint * Use xplr.util.paint and xplr.util.color in init.lua Co-authored-by: Noah Mayr <dev@noahmayr.com> * Add utility function xplr.util.textwrap (#567) * Add utility function xplr.util.wrap * Cleanup and fix formatting * Update src/lua/util.rs Co-authored-by: Arijit Basu <sayanarijit@users.noreply.github.com> * Update wrap to return lines instead * Fix doc * Rename wrap -> text wrap Co-authored-by: Arijit Basu <sayanarijit@users.noreply.github.com> Co-authored-by: Arijit Basu <sayanarijit@gmail.com> * Add xplr.util.relative_to and xplr.util.path_shorthand (#568) * Add xplr.util.relative_to and xplr.util.path_shorthand * Remove duplicate slash at end * Use pwd from env and remove pathdiff package * Some fixes and improvements * Generate docs * Some more improvements * Improve selection rendering * Improve functions with test cases * Update docs * Minor doc fix * Rename path_shorthand -> shortened * Handle homedir edgecase Also fix init.lua * Minor fix * Use config argument for relative and shortened paths * Prefix relative paths with "." and fix edge cases where we're not showing the file name * Use and_then instead of map and flatten * WIP: Move selection rendering to lua * Make selection renderer function configurable on lua side * Some improvements * Some impovements * Minor doc fix * Remove symlink style --------- Co-authored-by: Arijit Basu <sayanarijit@gmail.com> * Add xplr.util.layout_replaced (#574) Closes: https://github.com/sayanarijit/xplr/issues/573 * Improve selection operations (#575) - `:sl` to list selection. - `:ss` to softlink. - `:sh` to hardlink. - Avoid conflict by adding suffix. - Unselect individual path only on operation success. Closes: - https://github.com/sayanarijit/xplr/issues/572 - https://github.com/sayanarijit/xplr/issues/571 - https://github.com/sayanarijit/xplr/issues/570 * Minor updates * Add more features (#581) * Add more features - Key binding ":se" to edit selection list in $EDITOR - New utility functions: - xplr.util.clone - xplr.util.exists - xplr.util.is_dir - xplr.util.is_file - xplr.util.is_symlink - xplr.util.is_absolute - xplr.util.path_split - xplr.util.node Closes: https://github.com/sayanarijit/xplr/issues/580 Closes: https://github.com/sayanarijit/xplr/issues/579 Closes: https://github.com/sayanarijit/xplr/issues/577 * Fix edit selection list * Fix clippy lints * Fix layout link in doc * xplr.util.shortened -> xplr.util.shorten * Fix more clippy lints * Fix xplr.util.shorten name change * More UI utilities and improvements (#582) * More UI utilities and improvements - Apply style only to the file column in the table. - Properly quote paths. - Expose the applicable style from config in the table renderer argument. - Add utility functions: - xplr.util.node_type - xplr.util.style_mix - xplr.util.shell_escape * Make escaping play nice with shorten * Fix tests * Fix doc * Some fixes * Fix selection editor * Fix clear selection for selection editor * Add selection navigation (#583) * Add selection navigation - FocusNextSelection (ctrl-n) - FocusPreviousSelection (ctrl-p) Also improve batch operations * Minor doc fixes * Minor doc fix * Remove tab -> ctrl-i binding * Improve batch operation interaction - More robust focus operation. - Focus on failed to delete paths. * Fix Rust compatibility * Fix panic on permission denial Also, improve the error messages. * More logging improvements * Fix layout_replace only working with table parameters (#586) * Improve builtin search mode (#585) * Improve builtin search mode * Remove commented out code * Make search ranking and algorithm more extensible * Flatten messages BREAKING: xplr.config.general.sort_and_filter_ui.search_identifier -> xplr.config.general.sort_and_filter_ui.search_identifiers Messages: - Search - SearchFromInput - SearchFuzzy - SearchFuzzyUnranked - SearchFuzzyUnrankedFromInput - SearchRegexUnrankedFromInput - SearchRegex - SearchRegexUnranked - SearchRegexUnrankedFromInput - SearchRegexUnrankedFromInput - CycleSearchAlgorithm - EnableRankedSearch - DisableRankedSearch - ToggleRankedSearch Static config: xplr.config.general.search.algorithm = "Fuzzy" * Handle search ranking in search algorithm * Make CycleSearchAlgorithm only cycle between algorithms, without changing ranking * Separate algorithm and ordering * Minor doc updates * Some cleanup * Final touch * Cycle -> Toggle --------- Co-authored-by: Arijit Basu <sayanarijit@gmail.com> * Fix layout replace for unit layouts (#588) * Allow custom title and ui config in custom layout. (#589) * Allow custom title and ui config in custom layout. Adds the following layouts: - Static - Dynamic Deprecates `CustomContent` (but won't be removed to maintain compatibility). Closes: https://github.com/sayanarijit/xplr/issues/563 * Delete init.lua * Update docs/en/src/layout.md * Update docs/en/src/layout.md * Rename - Paragraph => CustomParagraph - List => CustomList - Table => CustomTable Also update init.lua * Fix clippy errs * Fix doc links * Fix search order * Improve working with file permissions (#591) * Improve working with file permissions Implements: - xplr.util.permissions_rwx - xplr.util.permissions_octal * Edit permissions * Add permissions in Resolved Node (#592) * Add permissions in Relolved Node And handle application/x-executable mime type. * Fix bench * Improve permissions editor * More permissions editor improvements * Doc updates * Remove ResolvedNode.permissions (#593) Reason: Too much serialization making lua calls slow. * Add workaround for macos with legacy coreutils (#595) Refs: - https://github.com/sayanarijit/xplr/issues/594 - https://github.com/sayanarijit/xplr/issues/559 * Use H:M:S format to display logs (#596) * Keep the selection list and clear manually (#597) * Keep the selection list and clear manually Ref: https://github.com/sayanarijit/map.xplr/issues/4 * Fix linting err * Fix broken history (#599) * Fix broken hostory Fixes: https://github.com/sayanarijit/xplr/issues/598 * Minor cleanup * Slightly optimize selection retention (#600) * Update deps * chrono -> time * update: 0.20.2 -> 0.21.1 * Update post-install.md * Upgrade guide * Minor fix * Fix tests * Add missing doc * Fix clippy lints --------- Co-authored-by: Noah Mayr <dev@noahmayr.com>
280 lines
6.3 KiB
Python
280 lines
6.3 KiB
Python
"""Generate docs from comments."""
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from typing import List
|
|
|
|
# Messages --------------------------------------------------------------------
|
|
|
|
MESSAGES_DOC_TEMPLATE = """
|
|
# Full List of Messages
|
|
|
|
xplr [messages][1] categorized based on their purpose.
|
|
|
|
## Categories
|
|
|
|
{categories}
|
|
|
|
{msgs}
|
|
|
|
## Also See:
|
|
|
|
- [Message][1]
|
|
|
|
[1]: message.md
|
|
""".strip()
|
|
|
|
CONFIGURATION_DOC_TEMPLATE = """
|
|
# Configuration
|
|
|
|
{doc}
|
|
|
|
""".strip()
|
|
|
|
|
|
@dataclass
|
|
class MsgSection:
|
|
title: str
|
|
body: List[str]
|
|
|
|
|
|
@dataclass
|
|
class MsgCategory:
|
|
title: str
|
|
sections: List[MsgSection]
|
|
|
|
|
|
@dataclass
|
|
class MsgResult:
|
|
categories: List[MsgCategory]
|
|
msgs: List[str]
|
|
|
|
|
|
def gen_messages():
|
|
"""Generate messages.md"""
|
|
|
|
path = "./src/msg/in_/external.rs"
|
|
res = []
|
|
reading = False
|
|
|
|
with open(path) as f:
|
|
lines = iter(f.read().splitlines())
|
|
|
|
for line in lines:
|
|
line = line.strip()
|
|
|
|
if line.startswith("pub enum ExternalMsg {"):
|
|
reading = True
|
|
continue
|
|
|
|
if not reading:
|
|
continue
|
|
|
|
if line == "}":
|
|
break
|
|
|
|
if line.startswith("/// ### "):
|
|
line = line.lstrip("/// ### ").rstrip("-").strip()
|
|
sec = MsgSection(title=None, body=[])
|
|
cat = MsgCategory(title=line, sections=[sec])
|
|
res.append(cat)
|
|
continue
|
|
|
|
if line.startswith("/// "):
|
|
line = line.lstrip("/// ").strip()
|
|
res[-1].sections[-1].body.append(line)
|
|
continue
|
|
|
|
if not line or line == "///":
|
|
res[-1].sections[-1].body.append("")
|
|
continue
|
|
|
|
if line.endswith(","):
|
|
line = line.split(",")[0].split("(")[0]
|
|
res[-1].sections[-1].title = line
|
|
|
|
sec = MsgSection(title=None, body=[])
|
|
res[-1].sections.append(sec)
|
|
continue
|
|
|
|
result = MsgResult(categories=[], msgs=[])
|
|
|
|
for cat in res:
|
|
slug = cat.title.lower().replace(" ", "-")
|
|
result.categories.append(f"- [{cat.title}](#{slug})")
|
|
result.msgs.append(f"### {cat.title}")
|
|
result.msgs.append("")
|
|
|
|
for sec in cat.sections:
|
|
if not sec.title:
|
|
continue
|
|
|
|
result.msgs.append(f"#### {sec.title}")
|
|
result.msgs.append("")
|
|
for line in sec.body:
|
|
result.msgs.append(f"{line}")
|
|
result.msgs.append("")
|
|
|
|
messages = MESSAGES_DOC_TEMPLATE.format(
|
|
categories="\n".join(result.categories), msgs="\n".join(result.msgs)
|
|
)
|
|
|
|
print(messages)
|
|
with open("./docs/en/src/messages.md", "w") as f:
|
|
print(messages, file=f)
|
|
|
|
|
|
# Configuration ---------------------------------------------------------------
|
|
|
|
|
|
def gen_configuration():
|
|
"""Generate the following docs.
|
|
|
|
- configuration.md
|
|
- general-config.md
|
|
- node_types.md
|
|
- layouts.md
|
|
- modes.md
|
|
- modes.md
|
|
"""
|
|
|
|
path = "./src/init.lua"
|
|
|
|
configuration = [[]]
|
|
general = [[]]
|
|
node_types = [[]]
|
|
layouts = [[]]
|
|
modes = [[]]
|
|
|
|
with open(path) as f:
|
|
lines = iter(f.read().splitlines())
|
|
|
|
reading = None
|
|
|
|
for line in lines:
|
|
if line.startswith("---"):
|
|
continue
|
|
|
|
if (
|
|
line.startswith("-- # Configuration ")
|
|
or line.startswith("-- ## Config ")
|
|
or line.startswith("-- ## Function ")
|
|
or line.startswith("-- ## On Load ")
|
|
):
|
|
reading = configuration
|
|
|
|
if line.startswith("-- ### General Configuration "):
|
|
reading = general
|
|
|
|
if line.startswith("-- ### Node Types "):
|
|
reading = node_types
|
|
|
|
if line.startswith("-- ### Layouts "):
|
|
reading = layouts
|
|
|
|
if line.startswith("-- ### Modes "):
|
|
reading = modes
|
|
|
|
if not reading:
|
|
continue
|
|
|
|
if line.startswith("-- ") or line == "--":
|
|
if line.startswith("-- #") and line.endswith("--"):
|
|
line = "\n{0}\n".format(line.rstrip("-"))
|
|
|
|
reading[-1].append(line[3:])
|
|
continue
|
|
|
|
if line.startswith("xplr.") and reading[-1]:
|
|
reading[-1].insert(0, "\n#### {0}\n".format(line.split()[0]))
|
|
continue
|
|
|
|
if not line.strip() and reading[-1]:
|
|
reading.append([])
|
|
continue
|
|
|
|
with open("./docs/en/src/configuration.md", "w") as f:
|
|
doc = "\n".join(["\n".join(c) for c in configuration])
|
|
print(doc)
|
|
print(doc, file=f)
|
|
|
|
with open("./docs/en/src/general-config.md", "w") as f:
|
|
doc = "\n".join(["\n".join(c) for c in general])
|
|
print(doc)
|
|
print(doc, file=f)
|
|
|
|
with open("./docs/en/src/node_types.md", "w") as f:
|
|
doc = "\n".join(["\n".join(c) for c in node_types])
|
|
print(doc)
|
|
print(doc, file=f)
|
|
|
|
with open("./docs/en/src/layouts.md", "w") as f:
|
|
doc = "\n".join(["\n".join(c) for c in layouts])
|
|
print(doc)
|
|
print(doc, file=f)
|
|
|
|
with open("./docs/en/src/modes.md", "w") as f:
|
|
doc = "\n".join(["\n".join(c) for c in modes])
|
|
print(doc)
|
|
print(doc, file=f)
|
|
|
|
|
|
# xplr.util -------------------------------------------------------------------
|
|
|
|
|
|
@dataclass
|
|
class Function:
|
|
doc: List[str]
|
|
name: str
|
|
|
|
|
|
def gen_xplr_util():
|
|
|
|
path = "./src/lua/util.rs"
|
|
|
|
functions: List[Function] = []
|
|
|
|
with open(path) as f:
|
|
lines = iter(f.read().splitlines())
|
|
|
|
reading = None
|
|
|
|
for line in lines:
|
|
if line.startswith("///"):
|
|
if reading:
|
|
reading.doc.append(line[4:])
|
|
else:
|
|
reading = Function(doc=[line[4:]], name="")
|
|
|
|
if line.startswith("pub fn") and reading:
|
|
reading.name = "\n### xplr.util." + line.split("<")[0].split()[-1] + "\n"
|
|
functions.append(reading)
|
|
reading = None
|
|
continue
|
|
|
|
with open("./docs/en/src/xplr.util.md", "w") as f:
|
|
for function in functions:
|
|
print(function.name)
|
|
print(function.name, file=f)
|
|
|
|
print("\n".join(function.doc))
|
|
print("\n".join(function.doc), file=f)
|
|
|
|
if reading:
|
|
print("\n".join(reading.doc), file=f)
|
|
|
|
|
|
def format_docs():
|
|
os.system("prettier --write docs/en/src")
|
|
|
|
|
|
def main():
|
|
gen_messages()
|
|
gen_configuration()
|
|
gen_xplr_util()
|
|
format_docs()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|