diff --git a/preserves.nimble b/preserves.nimble index 8ddd12a..f6987da 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20221106" +version = "20221120" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves/private/parse.nim b/src/preserves/private/parse.nim index e1bd502..c8cd1ec 100644 --- a/src/preserves/private/parse.nim +++ b/src/preserves/private/parse.nim @@ -23,7 +23,7 @@ proc joinWhitespace(s: string): string = for token, isSep in tokenize(s, Whitespace + {','}): if not isSep: add(result, token) -template unescape(buf: var string; capture: string) = +template unescape*(buf: var string; capture: string) = var i: int while i < len(capture): if capture[i] == '\\': diff --git a/src/preserves/schemaparse.nim b/src/preserves/schemaparse.nim index 0a2472c..04c7e1a 100644 --- a/src/preserves/schemaparse.nim +++ b/src/preserves/schemaparse.nim @@ -75,14 +75,15 @@ const parser = peg("Schema", p: ParseState): EmbeddedTypeName <- "embeddedType" * S * >("#f" | Ref) - Include <- "include" * +Space * (>(+Alnum) | >('"' * @'"')): - var - path = absolutePath(strip($1, true, true, {'"'}), p.directory) - ip = ParseState( + Include <- "include" * S * '"' * >(+Preserves.char) * '"': + var path: string + unescape(path, $1) + path = absolutePath(path, p.directory) + var state = ParseState( schema: move p.schema, directory: parentDir path) - match(readFile path, ip) - p.schema = move ip.schema + match(readFile path, state) + p.schema = move state.schema Definition <- >id * S * '=' * S * (OrPattern | AndPattern | Pattern): if p.schema.definitions.hasKey(Symbol $1):