diff --git a/sh/doc.awk b/sh/doc.awk new file mode 100644 index 0000000..68df6fa --- /dev/null +++ b/sh/doc.awk @@ -0,0 +1,77 @@ +function append(line) { + if (doc) { + doc = doc "\n" + } + doc = doc line +} + +function output(name) { + print name + print "↓" + print doc + exit +} + +function reset() { + doc = "" +} + +BEGIN { + RE_ANY = "(.*)" + RE_NAME = "([_A-Za-z][_0-9A-Za-z]*)" + RE_SPACE = "[[:space:]]" + RE_SPACES = RE_SPACE "*" + + RE_BEGIN = "^" + RE_END = RE_SPACES "$" + RE_FUNC = RE_SPACES "\\(" RE_SPACES "\\)" RE_SPACES "{" + + RE_ALIAS = RE_BEGIN "#\\(" RE_SPACES RE_NAME RE_END + RE_DOC = RE_BEGIN "#" RE_SPACE RE_ANY RE_END + RE_FUNCTION = RE_BEGIN RE_NAME RE_FUNC RE_END + RE_MODULE = RE_BEGIN "#." RE_SPACES RE_NAME RE_END + RE_SET = RE_BEGIN RE_NAME "=.*" RE_END + RE_SHEBANG = RE_BEGIN "#!" RE_SPACES RE_ANY RE_END + + alias = 0 + reset() + module = 0 +} + +{ + if (match($0, RE_MODULE, m)) { + reset() + if (m[1] == target) { + module = 1 + } + } else if (match($0, RE_SHEBANG, m)) { + append(m[1]) + } else if (match($0, RE_DOC, m)) { + append(m[1]) + } else if (match($0, RE_SET, m)) { + if (m[1] == target) { + output(m[1]) + } else { + reset() + } + } else if (match($0, RE_ALIAS, m)) { + if (m[1] == target) { + alias = 1 + } + append(m[1]) + } else if (match($0, RE_FUNCTION, m)) { + if (alias) { + output(m[1]) + } else if (m[1] == target) { + output(m[1]) + } else { + reset() + } + } else { + if (module) { + output(target) + } else { + reset() + } + } +} diff --git a/sh/main.sh b/sh/main.sh index 343cbe3..d4ad2e2 100755 --- a/sh/main.sh +++ b/sh/main.sh @@ -64,6 +64,7 @@ rwx_main() { # ╰──────┴───────╯ # cache source code of a module +# inside a global code variable rwx_cache() { local root="${1}" local module="${2}" diff --git a/sh/self.sh b/sh/self.sh index c181112..169921a 100644 --- a/sh/self.sh +++ b/sh/self.sh @@ -1,7 +1,17 @@ -# self module +# self +# module # meta doc rwx_doc() { + local name="${1}" + [ -n "${name}" ] || return + printf "%s" "${RWX_CODE}" | + awk \ + -f "${RWX_ROOT_SYSTEM}/doc.awk" \ + -v target="${name}" +} + +rwx_doc_old() { local name="${1}" [ -n "${name}" ] || return local constant doc func line module