diff --git a/esv_api.nimble b/esv_api.nimble index 1c1792f..03d2bd1 100644 --- a/esv_api.nimble +++ b/esv_api.nimble @@ -1,6 +1,6 @@ # Package -version = "0.1.0" +version = "0.2.0" author = "Jonathan Bernard" description = "Simple Nim CLI wrapper around the ESV API (api.esv.org)" license = "MIT" diff --git a/src/esv_api.nim b/src/esv_api.nim index 00f57e8..a20306c 100644 --- a/src/esv_api.nim +++ b/src/esv_api.nim @@ -3,9 +3,20 @@ ## Simple command-line wrapper around the ESV API. -import std/[httpclient, json, logging, os, re, strutils, uri] +import std/[httpclient, json, logging, os, re, strutils, uri, wordwrap] import cliutils, docopt, zero_functional +proc formatMarkdown(raw: string): string = + let rawLines = raw.splitLines --> map(it.strip) + let wrapped = (rawLines --> + filter(not isEmptyOrWhitespace(it.strip) and match(it, re"^\[\d+\].*")). + map(it.multiReplace([(re"\((\d+)\)", ""), (re"\[(\d+)\]", "**$1**")])). + map(wrapWords(it, maxLineWidth = 74, newLine = "\p"))). + join("\p") + + result = (wrapped.splitLines --> map("> " & it)).join("\p") & + "\p>\p> -- *" & rawLines[0] & " (ESV)*" + when isMainModule: const USAGE = """Usage: esv_api [options] @@ -17,6 +28,9 @@ Options: --echo-args Echo back the arguments that were passed on the command line for debugging purposes. + -f, --output-format Select a specific output format. Valid values + are 'raw', 'markdown', 'plain'. + -t, --esv-api-token Provide the API token on the command line. By default this will be read either from the .esv_api.cfg.json file or the ESV_API_TOKEN @@ -30,7 +44,7 @@ Options: try: # Parse arguments - let args = docopt(USAGE, version = "0.1.0") + let args = docopt(USAGE, version = "0.2.0") if args["--debug"]: consoleLogger.levelThreshold = lvlDebug @@ -55,8 +69,14 @@ Options: debug "requesting " & urlPath let respJson = parseJson(http.getContent(urlPath)) - let formattedPassages = respJson["passages"].getElems --> - map(it.getStr.multiReplace([(re"\[(\d+)\]", "$1")])) + let formattedPassages = + case $args["--output-format"]: + of "text": + respJson["passages"].getElems --> + map(it.getStr.multiReplace([(re"\[(\d+)\]", "$1")])) + of "raw": respJson["passages"].getElems --> map(it.getStr) + else: + respJson["passages"].getElems --> map(formatMarkdown(it.getStr)) echo formattedPassages.join("\p")