2019-01-07 14:53:08 -08:00
|
|
|
#!/usr/bin/python3
|
|
|
|
import argparse
|
2019-01-04 15:34:42 -08:00
|
|
|
import json
|
2019-01-06 12:44:00 -08:00
|
|
|
import re
|
2019-01-07 14:53:08 -08:00
|
|
|
import os
|
|
|
|
from pathlib import Path
|
2019-01-04 15:34:42 -08:00
|
|
|
|
2019-01-04 13:27:24 -08:00
|
|
|
import hug # type: ignore
|
|
|
|
import hug.types as T # type: ignore
|
|
|
|
|
2019-01-06 15:57:15 -08:00
|
|
|
from org_tools import append_org_entry
|
2019-01-04 13:27:24 -08:00
|
|
|
|
2019-01-07 14:53:08 -08:00
|
|
|
CAPTURE_PATH_VAR = 'GRASP_CAPTURE_PATH'
|
|
|
|
|
2019-01-04 15:34:42 -08:00
|
|
|
def empty(s) -> bool:
|
|
|
|
return s is None or len(s.strip()) == 0
|
2019-01-04 13:27:24 -08:00
|
|
|
|
2019-01-04 15:34:42 -08:00
|
|
|
def log(*things):
|
|
|
|
# TODO proper logging
|
|
|
|
print(*things)
|
|
|
|
|
|
|
|
# TODO allow to pass tags??
|
2019-01-04 13:27:24 -08:00
|
|
|
@hug.local()
|
|
|
|
@hug.post('/capture')
|
|
|
|
def capture(
|
|
|
|
url: T.text,
|
2019-01-04 15:57:34 -08:00
|
|
|
title: T.Nullable(T.text),
|
2019-01-04 13:27:24 -08:00
|
|
|
selection: T.Nullable(T.text),
|
|
|
|
comment: T.Nullable(T.text),
|
2019-01-06 12:44:00 -08:00
|
|
|
tag_str: T.Nullable(T.text),
|
2019-01-04 13:27:24 -08:00
|
|
|
):
|
2019-01-04 15:57:34 -08:00
|
|
|
log("capturing", url, title, selection, comment)
|
2019-01-04 15:34:42 -08:00
|
|
|
|
2019-01-07 14:53:08 -08:00
|
|
|
capture_path = Path(os.environ[CAPTURE_PATH_VAR]).expanduser()
|
|
|
|
|
2019-01-04 15:57:34 -08:00
|
|
|
heading = url
|
2019-01-04 15:34:42 -08:00
|
|
|
parts = []
|
2019-01-06 12:44:00 -08:00
|
|
|
tags = []
|
|
|
|
if not empty(tag_str):
|
|
|
|
tags = re.split('[\s,]', tag_str)
|
|
|
|
tags = [t for t in tags if not empty(t)] # just in case
|
2019-01-04 15:57:34 -08:00
|
|
|
|
|
|
|
if not empty(title):
|
|
|
|
heading = title
|
|
|
|
parts.append(url)
|
|
|
|
|
2019-01-04 15:34:42 -08:00
|
|
|
# TODO not sure, maybe add as org quote?
|
|
|
|
if not empty(selection):
|
|
|
|
parts.extend([
|
|
|
|
'Selection:',
|
2019-01-04 15:57:34 -08:00
|
|
|
selection, # TODO tabulate?
|
2019-01-04 15:34:42 -08:00
|
|
|
])
|
|
|
|
if not empty(comment):
|
|
|
|
parts.extend([
|
|
|
|
'Comment:',
|
|
|
|
comment
|
|
|
|
])
|
|
|
|
body = None if len(parts) == 0 else '\n'.join(parts)
|
|
|
|
|
2019-01-07 14:53:08 -08:00
|
|
|
# TODO format response on extension site
|
2019-01-04 15:34:42 -08:00
|
|
|
response = {
|
2019-01-07 14:53:08 -08:00
|
|
|
'file': str(capture_path),
|
2019-01-04 15:34:42 -08:00
|
|
|
}
|
|
|
|
try:
|
|
|
|
append_org_entry(
|
2019-01-07 14:53:08 -08:00
|
|
|
capture_path,
|
2019-01-04 15:57:34 -08:00
|
|
|
heading=heading,
|
2019-01-04 15:34:42 -08:00
|
|
|
body=body,
|
2019-01-06 12:44:00 -08:00
|
|
|
tags=tags,
|
2019-01-04 15:34:42 -08:00
|
|
|
todo=False,
|
|
|
|
)
|
|
|
|
response.update({
|
|
|
|
'status': 'ok',
|
|
|
|
})
|
|
|
|
except Exception as e:
|
|
|
|
log(str(e))
|
|
|
|
response.update({
|
|
|
|
'status': 'error',
|
|
|
|
'error' : str(e),
|
|
|
|
})
|
|
|
|
|
|
|
|
return json.dumps(response).encode('utf8')
|
2019-01-07 14:53:08 -08:00
|
|
|
|
|
|
|
def run(port: str, capture_path: str):
|
|
|
|
env = os.environ.copy()
|
|
|
|
# not sure if there is a simpler way to communicate with the server...
|
|
|
|
env[CAPTURE_PATH_VAR] = capture_path
|
|
|
|
os.execvpe(
|
|
|
|
'hug',
|
|
|
|
[
|
|
|
|
'grasp-server',
|
|
|
|
'-p', port,
|
|
|
|
'-f', __file__,
|
|
|
|
],
|
|
|
|
env,
|
|
|
|
)
|
|
|
|
|
|
|
|
def setup_parser(p):
|
|
|
|
p.add_argument('--port', type=str, default='12212', help='Port for communicating with extension')
|
|
|
|
p.add_argument('--path', type=str, default='~/capture.org', help='File to capture into')
|
|
|
|
|
|
|
|
def main():
|
|
|
|
p = argparse.ArgumentParser('grasp server setup', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
|
|
setup_parser(p)
|
|
|
|
args = p.parse_args()
|
|
|
|
run(args.port, args.path)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|