src/hastyscribepkg/consts.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 |
import std/[pegs] from std/strutils import strip type CssSelPriority* = enum csspIgnore, csspLowProto, csspDom, csspExt, csspProto Rule = tuple[selValue: string, definition: string] ## CSS selector rule Rules = seq[Rule] const CssSelLowPriorityProtos = ["http", "https"] proc parseLinkRules(css: string): array[CssSelPriority, Rules] = ## Parses a CSS in format adgering to `hastystyles.links.css`: ## Each line is a link styling with a single selector of ## `^=` / `*=` / `$=` and a `:before` # TODO: - Support multiple selectors for a styling: # either in form of "a[href$='.zip']:before, a[href$='.gz']:before" # or "a:is([href$='.zip'], [href$='.gz']):before" # - Support `:after` let peg_linkstyle_def = peg""" styles <- definition* definition <- 'a[href' op '\'' val '\']:before' \s* @ (\n / $) op <- ['^*$'] '=' val <- [a-z0-9-.#]+ """ var attr: tuple[kind: CssSelPriority; selValue: string] var linkRules: array[CssSelPriority, Rules] let parse = peg_linkstyle_def.eventParser: pkNonTerminal: leave: #debugEcho "leaving ", p.nt.name, " len=", length if length > 0: case p.nt.name of "op": # debugEcho " op:", s.substr(start, start+1) attr.kind = case s[start]: of '$': csspExt # endsWiths of '*': csspDom # contains of '^': csspProto # startsWith else: csspIgnore of "val": attr.selValue = s.substr(start, start+length-1) if attr.kind == csspProto and attr.selValue in CssSelLowPriorityProtos: attr.kind = csspLowProto of "definition": let definition = s.substr(start, start+length-1).strip() if attr.kind == csspIgnore or attr.selValue == "" or definition == "": echo "Error parsing `stylesheet_links`!"; quit(1) linkRules[attr.kind].add((attr.selValue, definition)) attr = (csspLowProto, "") else: discard # parsed the file discard parse(css) linkRules const stylesheet* = "./data/hastystyles.css".slurp stylesheet_badges* = "./data/hastystyles.badges.css".slurp stylesheet_icons* = "./data/hastystyles.icons.css".slurp #stylesheet_links* = "./data/hastystyles.links.css".slurp css_rules_links* = parseLinkRules("./data/hastystyles.links.css".slurp) stylesheet_notes* = "./data/hastystyles.notes.css".slurp hastyscribe_logo* = "./data/hastyscribe.svg".slurp watermark_style* = """ #container { position: relative; z-index: 0; } #container:after { content: ""; opacity: 0.1; z-index: -1; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background-image: url($1); background-repeat: no-repeat; background-position: center 70px; background-attachment: fixed; } """ eof_separator* = "<!-- $name: EOF -->" |