xssdoctor
8 months ago
committed by
GitHub
4 changed files with 187 additions and 18 deletions
@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env python3 |
||||
import argparse |
||||
import os |
||||
import sys |
||||
from datetime import datetime |
||||
|
||||
from dotenv import load_dotenv |
||||
|
||||
DEFAULT_CONFIG = "~/.config/fabric/.env" |
||||
PATH_KEY = "FABRIC_OUTPUT_PATH" |
||||
FM_KEY = "FABRIC_FRONTMATTER_TAGS" |
||||
DATE_FORMAT = "%Y-%m-%d" |
||||
load_dotenv(os.path.expanduser(DEFAULT_CONFIG)) |
||||
|
||||
|
||||
def main(tag, tags, silent, fabric): |
||||
out = os.getenv(PATH_KEY) |
||||
if out is None: |
||||
print(f"'{PATH_KEY}' not set in {DEFAULT_CONFIG} or in your environment.") |
||||
sys.exit(1) |
||||
|
||||
out = os.path.expanduser(out) |
||||
|
||||
if not os.path.isdir(out): |
||||
print(f"'{out}' does not exist. Create it and try again.") |
||||
sys.exit(1) |
||||
|
||||
if not out.endswith("/"): |
||||
out += "/" |
||||
|
||||
if len(sys.argv) < 2: |
||||
print(f"'{sys.argv[0]}' takes a single argument to tag your summary") |
||||
sys.exit(1) |
||||
|
||||
yyyymmdd = datetime.now().strftime(DATE_FORMAT) |
||||
target = f"{out}{yyyymmdd}-{tag}.md" |
||||
|
||||
# don't clobber existing files- add an incremented number to the end instead |
||||
would_clobber = True |
||||
inc = 0 |
||||
while would_clobber: |
||||
if inc > 0: |
||||
target = f"{out}{yyyymmdd}-{tag}-{inc}.md" |
||||
if os.path.exists(target): |
||||
inc += 1 |
||||
else: |
||||
would_clobber = False |
||||
|
||||
# YAML frontmatter stubs for things like Obsidian |
||||
# Prevent a NoneType ending up in the tags |
||||
frontmatter_tags = "" |
||||
if fabric: |
||||
frontmatter_tags = os.getenv(FM_KEY) |
||||
|
||||
with open(target, "w") as fp: |
||||
if frontmatter_tags or len(tags) != 0: |
||||
fp.write("---\n") |
||||
now = datetime.now().strftime(f"{DATE_FORMAT} %H:%M") |
||||
fp.write(f"generation_date: {now}\n") |
||||
fp.write(f"tags: {frontmatter_tags} {tag} {' '.join(tags)}\n") |
||||
fp.write("---\n") |
||||
|
||||
# function like 'tee' and split the output to a file and STDOUT |
||||
for line in sys.stdin: |
||||
if not silent: |
||||
print(line, end="") |
||||
fp.write(line) |
||||
|
||||
|
||||
def cli(): |
||||
parser = argparse.ArgumentParser( |
||||
description=( |
||||
'save: a "tee-like" utility to pipeline saving of content, ' |
||||
"while keeping the output stream intact. Can optionally generate " |
||||
'"frontmatter" for PKM utilities like Obsidian via the ' |
||||
'"FABRIC_FRONTMATTER" environment variable' |
||||
) |
||||
) |
||||
parser.add_argument( |
||||
"stub", |
||||
nargs="?", |
||||
help=( |
||||
"stub to describe your content. Use quotes if you have spaces. " |
||||
"Resulting format is YYYY-MM-DD-stub.md by default" |
||||
), |
||||
) |
||||
parser.add_argument( |
||||
"-t,", |
||||
"--tag", |
||||
required=False, |
||||
action="append", |
||||
default=[], |
||||
help=( |
||||
"add an additional frontmatter tag. Use this argument multiple times" |
||||
"for multiple tags" |
||||
), |
||||
) |
||||
parser.add_argument( |
||||
"-n", |
||||
"--nofabric", |
||||
required=False, |
||||
action="store_false", |
||||
help="don't use the fabric tags, only use tags from --tag", |
||||
) |
||||
parser.add_argument( |
||||
"-s", |
||||
"--silent", |
||||
required=False, |
||||
action="store_true", |
||||
help="don't use STDOUT for output, only save to the file", |
||||
) |
||||
args = parser.parse_args() |
||||
|
||||
if args.stub: |
||||
main(args.stub, args.tag, args.silent, args.nofabric) |
||||
else: |
||||
parser.print_help() |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
cli() |
Loading…
Reference in new issue