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 84 85 86 87 |
import std/[pegs] from std/strutils import strip type Rule = tuple[selValue: string, definition: string] Rules = seq[Rule] proc parseLinkRules(css: string): tuple[extensions, domains, protocols: 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-.#]+ """ type CssSelectorKind = enum selUnknown = "", selEnds = "$=", selContains = "*=", selStarts = "^=" RuleAttrs = object kind: CssSelectorKind = selUnknown selValue: string = "" var extensions, domains, protocols: Rules var attrs = default(RuleAttrs) 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) attrs.kind = case s[start]: of '$': selEnds of '*': selContains of '^': selStarts else: selUnknown of "val": attrs.selValue = s.substr(start, start+length-1) of "definition": let definition = s.substr(start, start+length-1).strip() if attrs.kind == selUnknown or attrs.selValue == "" or definition == "": echo "Error parsing `stylesheet_links`!"; quit(1) case attrs.kind: of selEnds: extensions.add((attrs.selValue, definition)) of selContains: domains.add((attrs.selValue, definition)) of selStarts: protocols.add((attrs.selValue, definition)) else: doAssert(false) # already checked attrs = default(RuleAttrs) else: discard # parsed the file discard parse(css) (extensions: extensions, domains: domains, protocols: protocols) 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 -->" |