Module yamhl.yamhl

Expand source code Browse git
from os import path
from pathlib import Path
from typing import Any, Dict, List
from os import path
from shutil import rmtree, move

import httpx

from .settings import stg
from .utils import ddir, srv_tpl, run

class Constants:
    pass

YAMHL = stg(None, "yamhl.yml")
MD_VARS_YML = ddir(YAMHL, "md_vars")
RMVC = ddir(MD_VARS_YML, "commons")

RULES = ddir(YAMHL, "rules")
PDOC = ddir(YAMHL, "pdoc")

def dd(od: Dict[str, List[str]], *dicts: List[Dict[str, List[str]]]) -> Dict[str, List[str]]:
    for d in dicts:
        for a, v in d.items():
            od[a] = [*(od.get(a, []) or []), *v]
    return od

def rules_fn(rules: Dict[Any, Any], key: str) -> Dict[str, List[str]]:
    _rules = ddir(rules, key)
    return dd({"": ddir(_rules, "del", [])}, ddir(_rules, "repl"))

def op_fn(ip, s: str):
    op = None
    if (_op:= ip.stem) not in ddir(YAMHL, f"{s}_op_exc", []):
        op = path.join(YAMHL[f'{s}_op'], *ip.parts[1:-1], f"{ddir(YAMHL, f'files_conv/{_op}/{s}_op', _op)}.{s}")
    return op

def repl(s: str, repl_dict: Dict[str, List[str]]) -> str:
    op = s
    for k, v in repl_dict.items():
        for i in v:
            op = op.replace(i, k)
    return op

for i in ["md", "html"]:
    setattr(Constants, f"{i}_rules", rules_fn(RULES, i))

def main(rmv: Dict[Any, Any]={}):
    if ddir(PDOC, "enabled", False):
        pn = PDOC["project"]
        docs_pdir = PDOC["op"]
        docs_dir = path.join(docs_pdir, "docs")
        rmtree(docs_dir)
        run(PDOC["command"].format(**{i: PDOC[i] for i in ["project", "templates", "op"]}))
        move(path.join(docs_pdir, pn), docs_dir)

    rmv_r = ddir(rmv, "rules")
    rmv_mv = ddir(rmv, "md_vars")
    for i in ["md", "html"]:
        setattr(Constants, f"{i}_repl", dd(rules_fn(RULES, i), rules_fn(rmv_r, i)))
    MVC = dict(RMVC, **ddir(rmv_mv, "commons"))
    for rip in list(Path(f'./{YAMHL["input"]}').rglob("*.md")):
        md_out, html_out = [op_fn(rip, i) for i in ["md", "html"]]

        with open(rip, "r") as ip:
            md = repl(ip.read(), Constants.md_repl)
            d = dict(MVC, **ddir(MD_VARS_YML, f"files/{rip.stem}"), **ddir(rmv_mv, f"files/{rip.stem}"))
            for k, v in d.items():
                md = md.replace(f"${{{k}}}", v)

            if md_out:
                with open(md_out, "w") as md_out:
                    md_out.write(md)

            if html_out:
                with open(html_out, "w") as html_out:
                    headers = {"accept": "application/vnd.github.v3+json"}
                    data = {"text": md}
                    md = str(
                        httpx.post("https://api.github.com/markdown", headers=headers, json=data).content,
                        encoding="utf-8"
                    )

                    html_out.write(srv_tpl("yamhl_html.mako", content=repl(md, Constants.html_repl)))

Functions

def dd(od: Dict[str, List[str]], *dicts: List[Dict[str, List[str]]]) ‑> Dict[str, List[str]]
Expand source code Browse git
def dd(od: Dict[str, List[str]], *dicts: List[Dict[str, List[str]]]) -> Dict[str, List[str]]:
    for d in dicts:
        for a, v in d.items():
            od[a] = [*(od.get(a, []) or []), *v]
    return od
def main(rmv: Dict[Any, Any] = {})
Expand source code Browse git
def main(rmv: Dict[Any, Any]={}):
    if ddir(PDOC, "enabled", False):
        pn = PDOC["project"]
        docs_pdir = PDOC["op"]
        docs_dir = path.join(docs_pdir, "docs")
        rmtree(docs_dir)
        run(PDOC["command"].format(**{i: PDOC[i] for i in ["project", "templates", "op"]}))
        move(path.join(docs_pdir, pn), docs_dir)

    rmv_r = ddir(rmv, "rules")
    rmv_mv = ddir(rmv, "md_vars")
    for i in ["md", "html"]:
        setattr(Constants, f"{i}_repl", dd(rules_fn(RULES, i), rules_fn(rmv_r, i)))
    MVC = dict(RMVC, **ddir(rmv_mv, "commons"))
    for rip in list(Path(f'./{YAMHL["input"]}').rglob("*.md")):
        md_out, html_out = [op_fn(rip, i) for i in ["md", "html"]]

        with open(rip, "r") as ip:
            md = repl(ip.read(), Constants.md_repl)
            d = dict(MVC, **ddir(MD_VARS_YML, f"files/{rip.stem}"), **ddir(rmv_mv, f"files/{rip.stem}"))
            for k, v in d.items():
                md = md.replace(f"${{{k}}}", v)

            if md_out:
                with open(md_out, "w") as md_out:
                    md_out.write(md)

            if html_out:
                with open(html_out, "w") as html_out:
                    headers = {"accept": "application/vnd.github.v3+json"}
                    data = {"text": md}
                    md = str(
                        httpx.post("https://api.github.com/markdown", headers=headers, json=data).content,
                        encoding="utf-8"
                    )

                    html_out.write(srv_tpl("yamhl_html.mako", content=repl(md, Constants.html_repl)))
def op_fn(ip, s: str)
Expand source code Browse git
def op_fn(ip, s: str):
    op = None
    if (_op:= ip.stem) not in ddir(YAMHL, f"{s}_op_exc", []):
        op = path.join(YAMHL[f'{s}_op'], *ip.parts[1:-1], f"{ddir(YAMHL, f'files_conv/{_op}/{s}_op', _op)}.{s}")
    return op
def repl(s: str, repl_dict: Dict[str, List[str]]) ‑> str
Expand source code Browse git
def repl(s: str, repl_dict: Dict[str, List[str]]) -> str:
    op = s
    for k, v in repl_dict.items():
        for i in v:
            op = op.replace(i, k)
    return op
def rules_fn(rules: Dict[Any, Any], key: str) ‑> Dict[str, List[str]]
Expand source code Browse git
def rules_fn(rules: Dict[Any, Any], key: str) -> Dict[str, List[str]]:
    _rules = ddir(rules, key)
    return dd({"": ddir(_rules, "del", [])}, ddir(_rules, "repl"))

Classes

class Constants
Expand source code Browse git
class Constants:
    pass

Class variables

var html_rules
var md_rules