hastyscribe.nim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
import os, parseopt, strutils, times, markdown let v = "1.0" let usage = " HastyScribe v" & v & " - Self-contained Markdown Compiler" & """ (c) 2013 Fabio Cevasco Usage: hastyscribe markdown_file [--notoc] Arguments: markdown_file The markdown file to compile into HTML. Options: --notoc Do not generate a Table of Contents.""" # Procedures proc parse_date(date: string, timeinfo: var TTimeInfo): bool = var parts = date.split('-').map(proc(i:string): int = try: i.parseInt except: 0 ) try: timeinfo = TTimeInfo(year: parts[0], month: TMonth(parts[1]-1), monthday: parts[2]) # Fix invalid dates (e.g. Feb 31st -> Mar 3rd) timeinfo = getLocalTime(timeinfo.TimeInfoToTime); return true except: return false proc style_tag(css): string = result = "<style>$1</style>" % [css] # Source Files const src_css = "assets/hastyscribe.css".slurp ### MAIN var input_file = "" var generate_toc = true # Parse Parameters for kind, key, val in getopt(): case kind of cmdArgument: input_file = key of cmdLongOption: if key == "notoc": generate_toc = false else: nil if input_file == "": quit(usage, 1) if input_file.existsFile == false: quit("Error: file \"$1\" does not exist" % [input_file], 2) let inputsplit = input_file.splitFile # Output file name let output_file = inputsplit.dir/inputsplit.name & ".htm" let source = input_file.readFile # Document Variables var metadata = TMDMetaData(title:"", author:"", date:"") var body = source.md(MKD_DOTOC or MKD_EXTRA_FOOTNOTE, metadata) let css = src_css.style_tag # Manage metadata if metadata.author != "": metadata.author = "by <em>" & metadata.author & "</em> –" var title_tag, header_tag, toc: string if metadata.title != "": title_tag = "<title>" & metadata.title & "</title>" header_tag = "<div id=\"header\"><h1>" & metadata.title & "</h1></div>" else: title_tag = "" header_tag = "" if generate_toc == true and metadata.toc != "": toc = "<div id=\"toc\">" & metadata.toc & "</div>" else: toc = "" # Date parsing and validation var timeinfo: TTimeInfo if metadata.date == "": discard parse_date(getDateStr(), timeinfo) else: if parse_date(metadata.date, timeinfo) == false: discard parse_date(getDateStr(), timeinfo) let document = """<!doctype html> <html lang="en"> <head> $title_tag <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="author" content="$author"> $css </head> <body> $header_tag <div id="toc"> $toc </div> <div id="main"> $body </div> <div id="footer"> <p>$author Generated with <a href="https://github.com/h3rald/hastyscribe/">HastyScribe</a> on $date</p> </div> </body>""" % ["title_tag", title_tag, "header_tag", header_tag, "author", metadata.author, "date", timeinfo.format("MMMM d, yyyy"), "toc", toc, "css", css, "body", body] output_file.writeFile(document) |